1. 程式人生 > >歸並排序(Merging Sort)

歸並排序(Merging Sort)

vpd AI apc gray gpe word main 遞歸實現 tde

歸並排序(Merging Sort):歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。   原理:假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸並,得到n除以2向上取整個長度為2或1的有序子序列;兩兩歸並,直到得到一個長度為n的有序序列為止。
#include<iostream>
using namespace std; //歸並排序,先數組細分為單個,在合並 int mergeArr(int* arr,int first,int mid,int last); int mergeSort(int* arr,int first,int last); //遞歸實現
int metgeSortIterator(int* arr,int first,int last); //非遞歸實現 void swap(int& elem1,int& elem2); void test(); void printArr(int* arr,int length);
int mergeArr(int* arr,int first,int mid,int last) { if(NULL==arr||first>last||first>mid||mid>last||first<0||mid<0||last<0) return -1; int len = last - first +1; int* tmpArr = new int[len](); int firIdx = first,lasIdx = mid + 1; int idx = 0; while(firIdx<=mid&&lasIdx<=last) { if(arr[firIdx]<arr[lasIdx]) tmpArr[idx++] = arr[firIdx++]; else tmpArr[idx++] = arr[lasIdx++]; } while(firIdx<=mid) tmpArr[idx++] = arr[firIdx++]; while(lasIdx<=last) tmpArr[idx++] = arr[lasIdx++]; for(int iidx=first,idx=0;iidx<=last;++iidx) arr[iidx] = tmpArr[idx++]; delete []tmpArr; return 0; } int mergeSort(int* arr,int first,int last) { if(NULL==arr||first<0||last<0||first>last) return -1; int mid = (first + last)/2; if(first<last) //劃分為只有一個元素 { mergeSort(arr,first,mid); mergeSort(arr,mid+1,last); } //合並 mergeArr(arr,first,mid,last); return 0; } int metgeSortIterator(int* arr,int first,int last) { if(NULL==arr||first<0||last<0||first>last) return -1; //非遞歸,直接合並 for(int idx=1;idx<=last;idx*=2) //都是兩兩合並,所以乘以2,最初從1開始,表示數組都劃分為1的單個數組 { int firstIdx = 0; while(firstIdx+idx<=last) { int mid = firstIdx + idx -1; //last有特殊情況,比如數組奇數個,最後會剩下一個元素 int lastIdx = mid + idx <= last ? mid + idx : last; mergeArr(arr,firstIdx,mid,lastIdx); firstIdx = lastIdx + 1; //開始合並下一個子序列 } } return 0; }

void printArr(int* arr,int length) { if(NULL==arr||length<=0) return ; for(int idx=0;idx!=length;++idx) { cout<<arr[idx]<<" "; } cout<<endl; } void test() { int arr[] = {6,5,3,1,8,7,2,4}; printArr(arr,8); mergeSort(arr,0,7); /*metgeSortIterator(arr,0,7);*/ printArr(arr,8); cout<<endl;
int arr1[] = {1,2,0,-1,5,6,8,3}; printArr(arr1,8); mergeSort(arr1,0,7); /*metgeSortIterator(arr1,0,7);*/ printArr(arr1,8); cout<<endl;
int arr2[] = {2,2,2,2}; printArr(arr2,4); mergeSort(arr2,0,3); //metgeSortIterator(arr2,0,3); printArr(arr2,4); cout<<endl;
int arr3[] = {2,4,1}; printArr(arr3,3); mergeSort(arr3,0,2); /*metgeSortIterator(arr3,0,2);*/ printArr(arr3,3); cout<<endl;
int arr5[] = {1,2,3,4,5,6,7,8}; printArr(arr5,8); mergeSort(arr5,0,7); /*metgeSortIterator(arr5,0,7);*/ printArr(arr5,8); cout<<endl;
int* arr6 = NULL; printArr(arr6,4); mergeSort(arr6,0,3); /*metgeSortIterator(arr6,0,3);*/ printArr(arr6,4); cout<<endl; } int main() { test(); system("pause"); } 技術分享圖片

歸並排序(Merging Sort)