排序问题

dpdp_2012 2012-10-30 09:17:09
都说快排是平均性能最好的,为什么我写的归并排序比快排快这么多,比STL中的sort还快,是哪里出了问题


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <string.h>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

#define N 1000000
int a[N],b[N];

int myrand()
{
int rs=0;

int n=N/10;
n=10000000;
while(n)
{
rs=rs*10+rand()%10;
n/=10;
}
return rs;
}

void init()
{
for(int i=0;i<N;i++)
{
a[i]=myrand();
}
}

void merge(int left,int mid,int right)
{
memcpy(b+left,a+left,(right-left+1)*sizeof(int));
int i=left,j=mid+1,k=left;
while(i<=mid&&j<=right)
{
if(b[i]<b[j])
a[k++]=b[i++];
else
a[k++]=b[j++];
}
while(i<=mid)
a[k++]=b[i++];
while(j<=right)
a[k++]=b[j++];
}

void mergeSort(int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergeSort(left,mid);
mergeSort(mid+1,right);
merge(left,mid,right);
}
}

int partition(int left,int right)
{
int pivot=a[left];
while(left<right)
{
while(left<right&&a[right]>=pivot)
right--;
if(left<right)
a[left++]=a[right];
while(left<right&&a[left]<=pivot)
left++;
if(left<right)
a[right--]=a[left];
}
a[left]=pivot;
return left;
}

void qsort(int left,int right)
{
if(left<right)
{
int mid=partition(left,right);
qsort(left,mid-1);
qsort(mid+1,right);
}
}

void qsort2(int left,int right)
{
struct shot
{
int left;
int right;
int mid;
int stage;
};
shot cur,p;
stack<shot> st;
cur.left=left,cur.right=right;
cur.stage=0;
st.push(cur);
while(st.size())
{
cur=st.top();
st.pop();
switch(cur.stage)
{
case 0:
if(cur.left<cur.right)
{
cur.mid=partition(cur.left,cur.right);
cur.stage++;
st.push(cur);
p.left=cur.left,p.right=cur.mid-1,p.stage=0;
st.push(p);
}
break;
case 1:
{
p.left=cur.mid+1,p.right=cur.right,p.stage=0;
st.push(p);
break;
}
}
}
}

int main()
{
long long t1,t2;
// test();
for(int type=0;type<10;type++)
{
init();
t1=GetTickCount();
switch(type)
{
case 0: //STL快排
sort(a,a+N);
t2=GetTickCount();
printf("STL快排%f秒\n",(t2-t1)/1000.0);
break;
case 1: //非递归快排
qsort2(0,N-1);
t2=GetTickCount();
printf("非递归快排%f秒\n",(t2-t1)/1000.0);
break;
case 2: //递归快排
qsort2(0,N-1);
t2=GetTickCount();
printf("递归快排%f秒\n",(t2-t1)/1000.0);
break;
case 3: //归并排序
mergeSort(0,N-1);
t2=GetTickCount();
printf("归并排序%f秒\n",(t2-t1)/1000.0);
break;
}
}
system("pause");
}
...全文
157 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dpdp_2012 2012-10-30
  • 打赏
  • 举报
回复
刚发现在debug下 STL中的sort比自己写的qsort慢很多
在release下,相差无几
dpdp_2012 2012-10-30
  • 打赏
  • 举报
回复
确认漏了srand(time(0)) 但是这个不影响数的随机行,只是第二次启动程序和第一次启动程序数组里的数完全一样而且。

case2 下面应为qsort(0,N-1) 这个一直没发现,囧

qsort2是我参照某方法弄的,这个很容易从递归转成非递归,但是貌似比网上实现的非递归快排有更多的压栈操作
Kuovane 2012-10-30
  • 打赏
  • 举报
回复
case 2:下面的语句qsort2(0,N-1); 应该改为 qsort(0,N-1);
测了几次,发现递归快排运行最快。
sort为什么这么慢呢?具体得看源码。估计因为它是通用的,不仅仅排整数的。

qsort2是非递归的,理论上来说应该比递归的快些,但是这里的实现方法用了更多的函数调用,而且值传递,每次都传4*4=16个字节过去,想不慢都难啊

其实还是 快排 快的:)


rocktyt 2012-10-30
  • 打赏
  • 举报
回复
你的随机数够随机吗

怎么我没找到srand,用rand一定要先srand
buyong 2012-10-30
  • 打赏
  • 举报
回复
因为你的测试样本都是已经排序好的。

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧