归并排序基于递归的思想,递归将一个数组分别等量的两个数组,最后再根据大小顺序插入help数组中保证help数组是有序的,将数组赋值到原数组。此方法基于分而治之的思想。根据Master公式:
T [n] = aT[n/b] + f (n)(直接记为T [n] = aT[n/b] + T (N^d))
其中 a >= 1 and b > 1 是常量,其表示的意义是n表示问题的规模,a表示递归的次数也就是生成的子问题数,b表示每次递归是原来的1/b之一个规模,f(n)表示分解和合并所要花费的时间之和。
解法:
①当d<logb a时,时间复杂度为O(n^(logb a))
②当d=logb a时,时间复杂度为O((n^d)*logn)
③当d>logb a时,时间复杂度为O(n^d)
可以知道显然归并排序的时间复杂度是O(nlogn),格外空间O(n);
void Mergesort(int* &arr,int l,int r); void Merge(int* &arr,int l,int mid,int r); void MergeSort(int* &arr,int n) { if( arr == NULL|| n<=1 ) return ; Mergesort(arr,0,n-1); } void Mergesort(int* &arr,int l,int r) { if(l==r) return; //printArr(arr,r); // int mid= l + ((r-l) >> 1); int mid= (l + r)/2; Mergesort(arr,l,mid); Mergesort(arr,mid+1,r); Merge(arr,l,mid,r); } // 1 4 9 || 3 5 6 // l mid mid+1 void Merge(int* &arr,int l,int mid,int r) { int *help=(int *)malloc(sizeof(int)*(r-l+1)); int i=0; int p1=l; int p2=mid+1; while(p1<=mid && p2<=r) { help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; } while(p1<=mid) { help[i++] = arr[p1++]; } while(p2<=r) { help[i++] = arr[p2++]; } for(i=l;i<=r;i++) { arr[i]=help[i-l]; } }