分享
 
 
 

[QuickSort]实现与测试(Implementation and test with C)

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

[QuickSort]实现与测试(Implementation and test with C)

By EmilMatthew 05/9/4

Quicksort 是一个知名的排序算法,由计算机科学家: C. A. R. Hoare 开发,算法的平均效率在theta(n*log(n)):

参:

http://www.yotor.com/wiki/zh/qu/Quicksort.htm

这个算法的主要思想仍是分治(Conquer and Divide),就是先挑选一个数(通常是首项)然后把比这个数小的数字都放到它的左边,比它大(或等于)的数都放在它的右边。然后在左右的两个小区间里反复这样的一个过程,直至区间小到不能再区分为止(只有一个数),此时,数组的排序工作也完成了。

在qSort算法中,这个将数字分成左边小于它的数右边都是大于它的数的过程叫做pation.

先请看pation过程的flashPPT动态演示:

http://www.flash8.net/bbs/UploadFile/2005-9/20059413511870.swf

接下来是代码:

long pation(Type* arr,long low,long high)

{

Type blankElement;

assertF(arr!=NULL,"in pation, arr is null\n");

blankElement=arr[low];

while(low<high)

{

while(arr[high]>=blankElement&&low<high)high--;

if(low<high)

{

arr[low]=arr[high];

low++;

}

while(arr[low]<=blankElement&&low<high)low++;

if(low<high)

{

arr[high]=arr[low];

high--;

}

}

assertF(high==low,"in quickSort's pation,high!=low\n");

arr[high]=blankElement;

return high;

}

Pation子过程的平均时间效率在theta(n)

Pation子过程的平均时间效率在theta(n)

Pation子过程的平均时间效率在theta(n)

Pation子过程的平均时间效率在theta(n)

剩下的就是qSort的主调用程序段,上面这个理解了之后,这个主程序就很好懂了:

void eQSort(Type* arr,long low,long high)

{

long mid;

assertF(arr!=NULL,"in qSort, arr is null\n");

if(high<=low)return;

else

{

mid=pation(arr,low,high);

eQSort(arr,low,mid-1);

eQSort(arr,mid+1,high);

}

}

其实,这里的首元素的选取是任意的,根本不用一定要以第一个元素为起点开始做,可以随机的选取一个位置作为主元,然后将第一个元素与之交换,不过这种算法期望运行时间仍在theta(n*log n).P.S.可能是由于我的随机数产生的方式(是在stdlib.h提供的rand函数的基础上做了一个产生的0-upLimit随机数算法)较慢,导致这个随机的快速排序算法的效率在测试中要比原来的慢些.

//这是我的随机数算法,现在看上去果然很低效啊,下次得自己写了~~~: )

Type eRandom(int upLimit)

{

Type tmpData;

do

{

tmpData=((Type)rand()/(Type)32767)*(Type)100.0*(Type)upLimit;

}

while(tmpData>upLimit);

return tmpData;

}

//这是随机的快速排序算法;

void eRQSort(Type* arr,long low,long high)

{

long rPos,mid;

assertF(arr!=NULL,"in qSort, arr is null\n");

if(high<=low)return;

else

{

rPos=low+(long)eRandom(high-low);

swapArrData(arr,low,rPos);

mid=pation(arr,low,high);

eRQSort(arr,low,mid-1);

eRQSort(arr,mid+1,high);

}

}

下面是我的测试结果:

a) 针对经典的QuickSort所做的测试:(编译器:VC6.0,语言:C)

b) 针对随机快速排序所做的测试(随机数生成算法效率过低).(编译器:VC6.0,语言:C)

Quick Sort

100,000个随机数

1,000,000个随机数

10,000,000个随机数

test1

0.047000s

0.562000s

10.344000s

test2

0.047000s

0.578000s

10.860000s

test3

0.047000s

0.562000s

10.282000s

Random Quick Sort

100,000个随机数

1,000,000个随机数

10,000,000个随机数

test1

0.218000s

2.578000s

30.812000s

test2

0.219000s

2.562000s

31.156000s

test3

0.218000s

2.594000s

30.956000s

而简单排序算法(bubble,selection,insert)在排序数目达到10,000的时候,算法的耗时就要以秒为单位来计算了。所以,当问题规模变大的时候,选择一种优秀的排序算法对最后的是否能在有效时间内得到结果显得至关重要。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有