归并排序的复杂度是O(nlogn) 性能优良,基本思想是这样的:乱序的数列,这里假设,3,1,0,0,4,8,6 。
- 第一趟排序,两个数字一组排序后结果为{1,3}{0,0}{4,8}{6},
- 第二趟排序,{0,0,1,3}{4,6,8}
- 第三趟排序,{0,0,1,3,4,6,8}
显然归并排序的主要操作在于合并操作(merge).
ok,不多说了,关于排序的讲解网上很多,这里直接上代码。
void merge(int *a,int p,int q,int r){
int n1 = q-p+1;
int n2 = r-q;
int *a1 = new int[n1];
int *a2 = new int[n2];
int p1 = p;
int q1 = q+1;
int i = 0;int j = 0;
while(i<n1) a1[i++] = a[p1++];//p--q有序数组存入a1
while(j<n2) a2[j++] = a[q1++];//q+1--r有序数组存入a2
i = 0; j = 0;
while(i<n1&&j<n2)
if(a1[i]<=a2[j]) a[p++] = a1[i++];
else a[p++] = a2[j++];
while(i<n1) a[p++] = a1[i++];
while(j<n2) a[p++] = a2[j++];
}
void mergeSort(int *a,int p,int r){
if(p<r){
int q = (p+r)/2;
mergeSort(a,p,q);
mergeSort(a,q+1,r);
merge(a,p,q,r);
}
}