关于一个二分排序的写法

fx397993401 2012-03-30 09:33:59
最近实现一个二分排序,两个版本,一个是以第一个元素作为分割点进行分割,另一个是 取数组 的第一个 中间一个 最后一个 的中位数 作为分割点 对应的实现 是 quicksort_rand 。

运行结果是 quicksort 正常 ;quicksort_rand 错误 。

数据文件下载地址 http://vdisk.weibo.com/s/3BEVZ


#include<stdio.h>
#include<stdlib.h>

int ans = 0 ; //用来统计比较的次数


void swap(int *a ,int *b)
{
int t = *a;
*a = *b;
*b = t;
}

//用第一个元素做为分割点
int partition1(int *data ,int s ,int e)
{
int x = data[s];
int j = s;
int i = 0;
for(i = s +1 ; i <= e ; i ++)
{
//ans ++;
if(data[i] < x)
{
j ++;
swap(&data[i],&data[j]);
}
}
swap(&data[s],&data[j]);
return j;

}

void quicksort(int *data ,int s,int e)
{
if(s < e)
{
ans += e-s;
int p = partition1(data,s,e);
/*quicksort(data,s,p);
quicksort(data,p +1 ,e);*/

quicksort(data,s,p-1);
quicksort(data,p +1 ,e);


}
}

int find_mid(int *data ,int s,int e)
{
int mid = (s+e)/2;
if( (data[mid] - data[s] )*(data[mid] -data[e]) < 0)
return mid;
if( (data[s] - data[mid] )*(data[s] -data[e]) < 0)
return s;
if( (data[e] - data[s] )*(data[e] -data[mid]) < 0)
return e;

}
//快速排序 随机化 ,然后这里我们选择
//using the "median-of-three" pivot rule
void quicksort_rand(int *data ,int s,int e)
{
if(s < e)
{
int mid = find_mid(data,s,e); // 找出三个数字中处于中间数的下标
swap(&data[s],&data[mid]) ;//将他和第一个数交换 这样可以重用 partition1 函数

ans += e-s;
int p = partition1(data,s,e);
quicksort_rand(data,s,p-1);
quicksort_rand(data,p+1 ,e);
}
}

int main()
{
//int data[9] = {0,2,8,7,1,3,5,6,4};

freopen("out","w",stdout);
int data[10000 + 10] = {0};
FILE *fp = fopen("QuickSort.txt","r");
int i = 0;
// while(fscanf(fp,"%d",&data[i++]) != EOF)
//一个隐藏的bug ,QuickSort文件中是有 10000 个数字,按照我最初的想法,结束后i = 10000,但是这样的写法是i= 10001;
//因为在最后读取文件末尾的时候 i ++ 仍被执行了一次
while(fscanf(fp,"%d",&data[i]) != EOF)
{
i ++;
}
//quicksort(data,0,i-1);
quicksort_rand(data,0,i-1);
int len = i-1;
for(i = 0 ; i <= len ; i ++)
{
printf("%d\n",data[i]);
}
printf("%d",ans);
//fclose(fp)
return 0;
}


...全文
112 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fx397993401 2012-03-30
  • 打赏
  • 举报
回复
//快速排序 随机化 ,然后这里我们选择
//using the "median-of-three" pivot rule
void quicksort_rand(int *data ,int s,int e)
{
if(s < e)
{
int mid = find_mid(data,s,e); // 找出三个数字中处于中间数的下标
swap(&data[s],&data[mid]) ;//将他和第一个数交换 这样可以重用 partition1 函数

问题应该是出现在上面两行

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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