歸併排序演算法詳解及其優化

2021-08-20 19:06:43 字數 2437 閱讀 9852

思想:分治法

每個遞迴過程涉及三個步驟

第一, 分解: 把待排序的 n 個元素的序列分解成兩個子串行, 每個子串行包括 n/2 個元素.

第二, 治理: 對每個子串行分別呼叫歸併排序__mergesort, 進行遞迴操作

第三, 合併: 合併兩個排好序的子串行,生成排序結果.

}while( begin1 <= end1 )//右半陣列走完了

while( begin2 <= end2 )//左半數組走完了

//tmp陣列已經排好序,將陣列內容拷到原陣列,遞迴向上一層走

index = left;

while( index

<= right )

}void mergesort( int *a,size_t n )

在遞迴子問題的時候在區間內的資料比較少的時候我們可以不再劃分區間,直接用直接插入排序效率會更高,因為接著劃分又要建立棧楨,沒有必要

void __mergesort( int *a, int left, int right, int * tmp  )

int mid = left+((right-left)>>1);

__mergesort(a,left,mid,tmp); // 遞迴左半數組

__mergesort(a,mid+1,right,tmp); // 遞迴右半陣列

//將排好序的兩部分陣列歸併(排序)

int begin1 = left,end1 = mid;

int begin2 = mid+1,end2 = right;

intindex = left;

while( begin1<=end1 && begin2<=end2 )// 迴圈條件:任乙個陣列排序完,則終止條件,最後將沒有比較完的陣列直接一一拷過去

else

}while( begin1 <= end1 )//右半陣列走完了

while( begin2 <= end2 )//左半數組走完了

//tmp陣列已經排好序,將陣列內容拷到原陣列,遞迴向上一層走

index = left;

while( index

<= right )

}void mergesort( int *a,size_t n )

#include 

using

namespace

std;

#include

//直接插入排序

void insertsort (int* a,size_t n)

else

break;

}a[end+1] = tmp;

}}void __mergesort( int *a, int left, int right, int * tmp )

int mid = left+((right-left)>>1);

__mergesort(a,left,mid,tmp); // 遞迴左半數組

__mergesort(a,mid+1,right,tmp); // 遞迴右半陣列

//將排好序的兩部分陣列歸併(排序)

int begin1 = left,end1 = mid;

int begin2 = mid+1,end2 = right;

int index = left;

while( begin1<=end1 && begin2<=end2 )// 迴圈條件:任乙個陣列排序完,則終止條件,最後將沒有比較完的陣列直接一一拷過去

else

}while( begin1 <= end1 )//右半陣列走完了

while( begin2 <= end2 )//左半數組走完了

//tmp陣列已經排好序,將陣列內容拷到原陣列,遞迴向上一層走

index = left;

while( index <= right )

}// 歸併排序

void mergesort( int *a,size_t n )

void print(int a,int len)

cout

; /* int a = ;*/

int len = sizeof(a)/sizeof(a[0]);

cout

<

print(a,len);

mergesort(a,len);

cout

<

print(a,len);

}int main ()

排序演算法 詳解歸併排序演算法

原理,首先將陣列遞迴的分解,直到達到終止條件返回,然後將分成兩段的陣列,進行比較,按從小到大的順序放在臨時陣列裡,然後將這一段排好順序的陣列複製給原來的陣列,繼續返回上一層,進行排序。直到完全完成遞迴。第二段結束了,第一段還有 if begin1 end1 第一段結束了,第二段還有 else 每次都...

演算法 歸併排序及優化

歸併排序是四大分類排序演算法之一,也是面試常考到的問題。歸併排序思想 將陣列遞迴拆分成兩個陣列,每執行一次拆分,同時也執行一次排序合併,即拆分多少次,就排序合併多少次,最後結果為乙個有序陣列。要注意,拆分的最小陣列只有乙個數字。演示如下 實現 如下 let numbers 54,68,12,34,3...

排序演算法之歸併排序演算法優化

之前寫了一篇介紹排序演算法的排序演算法之插入排序 希爾排序 歸併排序 c 發現計算陣列的逆序對,我的演算法速度比別人要慢很多倍。下面來分析一下為什麼這兩種歸併演算法會相差那麼多。第一種慢速歸併演算法,如下 歸併排序 public int mergesort int array 陣列擷取成左右兩個 i...