归并排序的思想集中体现在:归和并上。归是指使用递归(分治)的思想,并是指分到最小单元的时候,开始合并。
废话不多说,直接贴代码,有问题欢迎评论讨论。
代码如下,经验证和冒泡排序结果一致。
#include<iostream> using namespace std; #define N 12 //并 void Merge(int *a,int left,int middle,int right) { int i=left; int j=middle+1; int k=0; int *tmp = new int[right - left +1]; while(i <= middle && j<= right) { if(a[i] < a[j]) { tmp[k++]=a[i++]; } else { tmp[k++]=a[j++]; } } while(i<=middle) { tmp[k++] = a[i++]; } while(j<= right) { tmp[k++] = a[j++]; } for(int m=0,n=left;m<right - left +1;m++,n++) { a[n] = tmp[m]; } delete[] tmp; } //归 void MergeSort(int *a,int left,int right) { if(left == right) return; int middle = left + ((right - left)>>1); MergeSort(a,left,middle); MergeSort(a,middle+1,right); Merge(a,left,middle,right); } void BubbleSort(int *a, int length) { for(int i=length-1;i>=0;i--) { for(int j=0;j+1<i;j++) { if(a[j]>a[j+1]) { int swap=a[j+1]; a[j+1] = a[j]; a[j] = swap; } } } } void ArrayCopy(int *a, int *b, int length) { for(int i=0;i<length;i++) { b[i] = a[i]; } } void printArray(int *a, int length) { for(int i=0;i<length;i++) { cout<<a[i]<<" "; } cout<<endl; } int main() { int input[N]={5,4,3,2,1,7,9,8,0,11,15,21}; int cinput[N]={0},cinput2[N]={0},cinput3[N]={0}; ArrayCopy(input,cinput,N); MergeSort(input,0,N-1); BubbleSort(cinput,N); printArray(input,N); printArray(cinput,N); return 0; }