归并排序比快速排序慢吗?只是没有写对罢了
众所周知,归并 排序比快速排序慢,虽然它稳定,而且时间上也稳定,但是就是慢20%~100%,今天,我经过优化,使其达到了与快速排序相同的水平,对于1W-1000W的完全随机生成的小于1亿的int数据,其与普通快速排序的差距在5%以内,而且有时是它比普通快速排序快5%。对于经过随机数优化的快速排序,我的归并排序比其快10%左右,对于经典的归并排序,我的比它快20%左右。(1W以下时间几乎都是0没法比哈哈)
先上写法
对于一般的没有研究过的人来说,归并就是借用一个数组,来进行左右两半的排序,然后复制回去,但是我的算法不一样
先借用b数组对a数组进行排序,将对等的a,b里的b的所有数左右分别排序,然后合并到a上去
那么,b数组怎么排序呢?当然是借用a数组进行排序啦!
晕了吧?
其实很简单,我们通常的算法是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
这个是从
1 2 3 4 5 6 7 8 + 9 10 11 12 13 14 15 16中来的
而上面又是
1 2 3 4 + 5 6 7 8 + 9 10 11 12 + 13 14 15 16中来的
然后又要先排序
1 2 + 3 4 + 5 6 + 7 8 + 9 10 + 11 12 + 13 14 + 15 16
这样就完了。
但是我的算法是,把第1,3,5,7.。。步所用的数组合并
同理把2,4,6,8,10步的数组合并
好吧我讲晕了,直接上代码
void merge(int a[], int b[], int l, int r)
{
int mid=(l+r)/2;
if (l<mid)
merge(b,a,l,mid);//注意这里,这就是我的算法的核心,下面的和别人都一样
if(mid+1<r)
merge(b,a,mid+1,r);//同理,核心
int c=l,d=mid+1,e=l;
while(c<=mid&&d<=r)
{
if(b[c]<=b[d])
a[e++]=b[c++];
else
a[e++]=b[d++];
}
while(c<=mid)
a[e++]=b[c++];
while(d<=r)
a[e++]=b[d++];
}
void mergesort(int a[],int n)
{
int *b=new int[n];
for (int i=0;i<n;i++)
b[i]=a[i];//注意,先把辅助数组的所有东西和原来的数组弄成一样的。
merge(a,b,0,n-1);
delete[] b;
}
然后经典快速排序相信大家都深入骨髓了(但是我没有,我一直是用c++的库的哈哈)
void quicksort(int a[],int l,int r)
{
if (l>r)return;
int i = l;
int j = r;
int base = a[l];
while(i != j) {
while(a[j] >= base && i<j) {
j--;
}
while(a[i] <= base && i<j) {
i++;
}
if(i<j) {