最坏时间复杂度O(nlogn)
最好时间复杂度O(nlogn)
void merge(int *a,int lo,int mi, int hi){
int nl = mi-lo+1;//左边的长度
int nr = hi - mi;//右边的长度
int *L = new int[nl+1];//空出一个哨兵的位置
int *R = new int[nr+1];
L[nl] = 100000;//左边队列的哨兵
R[nr] = 100000;//右边队列的哨兵
int i,j,k;
for(i=0; i<nl; i++){
L[i] = a[lo+i];//把左边部分的值赋给一个保存左边值的临时队列
}
for(j=0; j<nr;j++)
R[j] = a[mi+1+j];
//k从lo的位置开始
for(i =0,j=0,k=lo;k<= hi;k++){
if(L[i] <= R[j]){//把较小的值赋给主队列
a[k] =L[i];
i++;
}else{
a[k] = R[j];
j++;
}
}
delete []L;
delete []R;
}
void mergeSort(int *a, int lo,int hi){
if(lo < hi){
int mi = (lo+hi) >> 1;
mergeSort(a,lo,mi);
mergerSort(a,mi+1,hi);
merge(a,lo,mi,hi);
}
}
void main(){
int a[] = {9,8,7,6,5,4,3,2,1};
int n = sizeof(a)/sizeof(a[0]);
int lo = 0;
int hi = n-1;
mergeSort(a,lo,hi);
}