常用排序演算法遞迴篇之歸併排序

2021-06-08 19:14:41 字數 1935 閱讀 1630

合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的乙個非常典型的應用。合併排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。 將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。合併排序也叫歸併排序。

歸併排序的實現描述:

1、首先把待排序陣列分成左陣列和右陣列兩部分;

2、分別對左陣列和右陣列進行迭代排序(當左陣列和右陣列的元素個數小於等於1個時迭代結束);

3、然後將左陣列和右陣列進行合併,那麼生成的整個陣列就是有序的。

當左陣列或者右陣列的元素個數小於等於1個時,即可認為陣列本身就是有序的,然後對有序的陣列再進行合併,那麼合併之後的陣列還是有序的。具體實現**如下:

void merge_sort(int *array, int length)

_merge_sort(array, 0, length - 1);

}void _merge_sort(int *array, int start, int end)

int middle = (start + end) / 2;

_merge_sort(array, start, middle);

_merge_sort(array, middle + 1, end);

_merge_data(array, start, middle, end);

}//合併資料array[start...middle]和資料array[middle+1...end]

void _merge_data(int *array, int start, int middle, int end)

else

}while (i <= middle - start)

while (j < len - 1)

free(arr);

return;

}

快速排序和歸併排序的異同點總結:

相同點:都是遞迴排序

不同點:快速排序是先分類再遞迴,歸併排序是先遞迴再合併。

從歸併排序的遞迴過程中可以看出,就是不停地把陣列拆分成左右元素個數相同(最多相差乙個元素)的兩個子陣列,直到子陣列只有乙個元素時才返回開始合併。我們可以反過來想一想,是否可以不利用遞迴的方法拆分陣列。具體拆分、合併方法如下:

第一輪:子陣列的長度為1,左陣列是array[0],右陣列是array[1],然後合併左右陣列;左陣列是array[2],右陣列是array[3],然後合併左右陣列;。。。

第二輪:子陣列的長度為2,左陣列是array[0]、array[1],右陣列是array[2]、array[3],然後合併左右陣列;。。。

第n輪:子陣列的長度為2^(n-1),左陣列是array[0...2^(n-1)-1],右陣列是array[2^(n-1)...length-1],然後合併左右陣列;。。。

方法總結:首先將陣列的每個元素看成是長度為1的有序子陣列,然後將這些有序子陣列兩兩合併成長度為2的有序子陣列,然後再兩兩合併...直至合併成長度為length的有序陣列。具體實現**如下:

void merge_sort(int *array, int length)

int start = 0; //起始下標

int end =0; //結束下標

int len = 0; //子串行長度

len = 1; //將序列每個元素看成是長度為1的子串行

while (len < length)

if (_merge_data(array, start, start + len - 1, end)) //合併失敗

start = end + 1;

}len *= 2;

}}

演算法篇之歸併排序

歸併排序是建立在歸併操作上採用分治法的一種排序演算法。將2個有序數列進行歸併操作。比較2數列第乙個數的大小,取小的放入合併數列並刪除該數,直至乙個數列為空,則將另一數列一次新增至合併數列。memeryarray int a,int b,int c while i a.length c k c i w...

歸併排序 遞迴演算法

陣列排序任務可以如下完成 1 將前一半排好序 2 將後一半排好序 3 把兩半歸併到乙個新的有序陣列中,然後再拷貝回原來的陣列,排序完成 利用遞迴思想將陣列一直劃分為要排序的另一半,最後就回將問題化簡為相鄰兩個數的排序,然後將排好序的陣列歸併到乙個陣列中,然後繼續向上遞迴直至排序完成。int a 10...

常用排序演算法 歸併排序

歸併排序 基本思想 先把陣列拆分,直到分成都只含有乙個元素的陣列,這樣兩兩合併,逐漸就可以得到已排序的字陣列,繼續合併直到合併成原來陣列長度為止。時間複雜度 o nlogn 空間複雜度 o nlogn 每一輪合併都需要n空間,共需要logn輪 第一輪是1 n 需要n個陣列,每個陣列長度為1 第二輪是...