一、归并排序算法基本思想
归并排序是基于分治的思想,把整个数组Array的排序问题,分成两个子数组Array1和Array2的先各自排序,然后合并成一个新数组的问题。以此递归下去,直到子数组的大小为1的时候,结束递归调用。
二、归并排序的数据结构
利用数组,以递归树的形式来解决。
三、排序过程图解
四、算法源代码
1.二路归并排序
/** 二路归并排序 */ #include<cstdio> //待排序的数组 int arry[] = {2,5,6,7,3,1}; int cmp; void mergeSort(int arr[],int s,int t); void myMerge(int arr[],int s,int m,int t); void printArr(int arr[],int s, int t); int main() { cmp = 0; printf("Before merge-sorting the array is :\n"); printArr(arry,0,5); mergeSort(arry,0,5); printf("After merge-sorting the array is :\n"); printArr(arry,0,5); printf("\n cmp = %d",cmp); return 0; } //归并排序 void mergeSort(int arr[],int s,int t) { if(s<t) { int m = (s+t)/2; mergeSort(arr,s,m); mergeSort(arr,m+1,t); myMerge(arr,s,m,t); } else { return ; } } //合并两个排好序的数组 void myMerge(int arr[],int s,int m,int t) { int i = s; int j = m+1; int p = 0; //这里借用了一个中间数组来合并 int newArr[t-s+1]; while(i<=m&&j<=t){ if(arr[i]<arr[j]){ newArr[p++] = arr[i++]; }else{ newArr[p++] = arr[j++]; } cmp++; } while(i<=m) newArr[p++] = arr[i++]; while(j<=t) newArr[p++] = arr[j++]; p = 0; for(int k=s;k<=t;k++) arr[k] = newArr[p++]; } //打印数组 void printArr(int arr[],int s, int t) { for(int i=s;i<=t;i++) printf("%d ",arr[i]); printf("\n"); }
2.三路归并排序(拓展)
#include<cstdio> //待排序测试的数组 int arry[] = {7,11,9,15,18,22,0,1,102,18,19}; void mergeSort(int arr[],int s,int t); void myMerge(int arr[],int s,int m,int t); void printArr(int arr[],int s, int t); int main() { printf("Before merge-sorting the array is :\n"); printArr(arry,0,10); mergeSort(arry,0,10); printf("After merge-sorting the array is :\n"); printArr(arry,0,10); return 0; } //归并排序 void mergeSort(int arr[],int s,int t) { if(s<t) { int p1 = (t-s)/3+s; int p2 = (t-s)/3*2 + s; //分成三段 mergeSort(arr,s,p1); mergeSort(arr,p1+1,p2); mergeSort(arr,p2+1,t); //归并两次 myMerge(arr,s,p1,p2); myMerge(arr,s,p2,t); } else { return ; } } //合并两个排好序的数组 void myMerge(int arr[],int s,int m,int t) { int i = s; int j = m+1; int p = 0; //这里借用了一个中间数组来合并 int newArr[t-s+1]; while(i<=m&&j<=t){ if(arr[i]<arr[j]){ newArr[p++] = arr[i++]; }else{ newArr[p++] = arr[j++]; } } while(i<=m) newArr[p++] = arr[i++]; while(j<=t) newArr[p++] = arr[j++]; p = 0; for(int k=s;k<=t;k++) arr[k] = newArr[p++]; } //打印数组 void printArr(int arr[],int s, int t) { for(int i=s;i<=t;i++) printf("%d ",arr[i]); printf("\n"); }