1. 程式人生 > >八大排序算法之七-歸並排序

八大排序算法之七-歸並排序

遞增 ron 分配 urn img 元素 繼續 image return

歸並類的排序算法

歸並:將兩個或兩個以上的有序表組合成一個新的有序表。

內部排序中,通常采用的是 2-路歸並排序。即:將兩個位置相鄰的記錄有序子序列歸並為一個記錄有序的序列。歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。

圖解如下

技術分享

看成是 n 個有序的子序列(長度為 1),然後兩兩歸並。

技術分享

得到 n/2 個長度為2 或 1 的有序子序列。繼續亮亮歸並

技術分享

最後一趟

技術分享

代碼如下:

#include<iostream>
#include <cstdlib>
using namespace
std; ////二路一次歸並過程的算法 void Merge(int a[],int low,int mid,int high) { //mid+1為第2有序區第1個元素,mid為第1有序區的最後1個元素 //i 指向第 1 有序區的第 1 個元素 int i=low; int j=mid+1; int *temp=new int[high-low+1]; //內存分配失敗 if(!temp) { cout<<"數組分配失敗"; exit(0); } int k=0; //順序選取兩個有序區的較小元素,存儲到t數組中,因為是遞增排序
while(i<=mid&&j<=high) { if(a[i]<=a[j]) temp[k++]=a[i++]; else { temp[k++]=a[j++]; } } //比完之後,假如第1個有序區仍有剩余,則直接全部復制到 temp 數組 while(i<=mid) { temp[k++]=a[i++]; } //比完之後,假如第2個有序區還有剩余,則直接全部復制到 temp 數組
while(j<=high) { temp[k++]=a[j++]; } //將排好序的序列,重存回到 a 中 low 到 high 區間 for(i=low,k=0;i<=high;i++,k++) { a[i]=temp[k]; } delete[]temp; } void mergeSort(int a[],int low,int high) { //二路歸並排序,分為二路 int mid=(low+high)/2; if(low<high) { ////遞歸過程,二路歸並排序遞歸過程 mergeSort(a,low,mid); mergeSort(a,mid+1,high); //歸並 Merge(a,low,mid,high); } } int main() { int source[]={49,38,65,97,76,13,27}; mergeSort(source,0,6); for(int i=0;i<7;i++) { cout<<source[i]<<" "; } return 0; }

八大排序算法之七-歸並排序