归并排序

归并排序的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了.

这样通过先递归的分解数列,再合并数列就完成了归并排序。

void MergeArray(int* array,int first,intmid,int last,int*tempArray)

{

       inti=first,j=mid+1;

       intm=mid,n=last;

       intk=0;

       while(i<=m&&j<=n)

       {

              if(array[i]<=array[j])

                     tempArray[k++]=array[i++];

              else

                     tempArray[k++]=array[j++];

       }

       while(i<=m)

              tempArray[k++]=array[i++];

       while(j<=n)

              tempArray[k++]=array[j++];

       for(inti=0;i<k;i++)

              array[first+i]=tempArray[i];

}

void mergesort(int* array,int first,intlast,int* tempArray)

{

       if(first<last)

       {

              intmid=(first+last)/2;

              mergesort(array,first,mid,tempArray);

              mergesort(array,mid+1,last,tempArray);

              MergeArray(array,first,mid,last,tempArray);

       }

}

void MergeSort(int* array,int n)

{

       if(array==NULL||n<1)

              return;

       int*tempArray=new int[n];

       mergesort(array,0,n-1,tempArray);

       delete[]tempArray;

}


假设数列长度为N,将数列分成小数列一共需要logN,每步都是一个合并有序数列,时间复杂度为O(N),故时间复杂度O(NlogN).

归并排序的效率很高,在数组不是特别巨大的时候(10万个元素以内的排序),归并排序甚至比快速排序的效率还要高。但是归并排序需要用到一个辅助数组,空间复杂度也是O(n),当数据量巨大时,百万甚至千万,上亿的数组时,性能就比如快排和堆排序了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值