分段有序陣列合併成有序(空間複雜度為O 1 )

2021-08-27 12:29:53 字數 1289 閱讀 1502

題目描述:

陣列a,長度為n,其中a[0, m-1] 和 a[m, n-1],都分別有序。將其合併成有序陣列a[0,n-1],要求空間複雜度為o(1)。

現在的題目條件是陣列分段有序,前後兩部分已經有序,如果沒有空間複雜度的限制,可以通過建立乙個長度為n的空間,然後在o(n)時間內歸併成乙個有序的陣列。

(1)直接插入排序

常見的比較排序演算法我們都知道,我們知道在已經基本排序的基礎上,直接插入排序的效率是比較高的,所以首先我們能想到的就是利用直接插入排序的方法來解決這個問題,時間複雜度t(n) = m*(n-m),這是因為每次確定插入位置時,最多需要比較和移動m次,因為前面已經插入的元素已經是在最終位置上了(a[m, n -1]也是有序的原因)。

具體**如下:

template void directinsertmerge(type *array, int low, int high, int m)

type exchange;

int j;

for (int i = m; i <= high; ++i)

else

}if( i == j + 1) break;//插入位置為當前所在位置,整個陣列已經有序

array[j + 1] = exchange;}}

(2)另一種解法將a[m]與a[0...m-1]的元素依次順序比較,當a[m] < a[i]時,將a[m]a[i]進行交換,然後對a [m...n - 1]進行重新排序使其有序(可採用直接插入),然後依次重複上述步驟,不過是a[m]與a[i+1...m-1]的元素依次順序比較。因為i前面的元素已經在起該在的位置上了。如下圖:

這種演算法的時間複雜度和直接插入排序一樣,t(n) = m*(n-m),源**如下:

template void mergepartialseq(type *array, int low, int high, int m)

type exchange;

int i = low;

while( i < m)

array[j - 1] = exchange;

++i;}}

may 28, 2013 @lab

兩個有序陣列合併成乙個有序陣列

public class arraysort int b int c mergearray a,b for int n c 合併陣列 public static int mergearray int a int b else return flag package com.bi 兩個有序陣列合併成乙...

演算法 兩個有序陣列合併成乙個有序陣列

兩個有序陣列的合併函式 public static int mergelist int a,int b else 後面連個while迴圈是用來保證兩個陣列比較完之後剩下的乙個陣列裡的元素能順利傳入 while i result k a i while j result k b j return re...

演算法有序陣列合併

最近看一本書上有乙個面試題,原題目是 有兩個遞增陣列 a1 a2,a1的記憶體空間足夠長,現在要求合併 a2到a1,並且要求移動次數最小 面試的時候 我們盡量要以 最高效的方式完成 下面是此題 o n 解法。合併 void mergearray int arra1,int arra2,int nle...