您的位置:首页 > 其它

算法导论-排序(二)快速排序、随机化快速排序

2014-09-13 17:50 555 查看

目录

1、本文介绍

2、快速排序

3、随机化快速排序

4、完整源码

5、参考资料

内容

1、本文介绍

主要内容分为两部分,一部分是介绍快速排序算法,分析其在最好、最坏以及最好最差交替出现情况下的算法效率;另一部分则是介绍随机化快排算法,以及分析其算法复杂度。最后给出c++实现代码。

2、快速排序

快速排序也是基于分治思想,首先把要排序的数组分为两份,然后再分别对分好的子数组进行快速排序。当子数组为1个元素时递归介绍,排序完成。快速排序属于“原地排序”,就是说在原有的数组内存上排序、不占用其他内存。归并排序就不一样,它则需要额外的空间来进行归并排序操作。下图是快速排序的分治思想:

#include <iostream>
#include <vector>
#include <time.h>
#include <Windows.h>
using namespace std;
#include "Sort.h"
#include "CTimer.h"

#define  N 10   //排序数组大小
// 随机参数排序数组
void Random(vector<int> &a,int n)
{
int i=0;
srand( (unsigned)time( NULL ) );
while(i<n)
{
a[i++]=rand();
}
}
int main()
{
Sort<int> sort1;
CTimer t;
vector<int > vec_int(N);
Random(vec_int,N);
cout<<"源数组:";
sort1.print_element(vec_int);
t.Start();
sort1.Quick_Sort(vec_int,0,vec_int.size()-1);
cout<<"快速排序:"<<t.End()<<"ms"<<endl;
sort1.print_element(vec_int);
Random(vec_int,N);
t.Start();
sort1.Random_Quick_Sort(vec_int,0,vec_int.size()-1);
cout<<"随机化快速排序:"<<t.End()<<"ms"<<endl;
sort1.print_element(vec_int);
Random(vec_int,N);
t.Start();
sort1.insertion_sort(vec_int);
cout<<"插入排序:"<<t.End()<<"ms"<<endl;
sort1.print_element(vec_int);
Random(vec_int,N);
t.Start();
sort1.merge_sort(vec_int,0,vec_int.size()-1);
cout<<"归并排序:"<<t.End()<<"ms"<<endl;
sort1.print_element(vec_int);

system("PAUSE");
return 0;
}


View Code

输出:



排序算法时间比较:

数组大小快速排序(ms)随机化快速排序(ms)插入排序(ms)归并排序(ms)
100.00545230.006735520.004810850.0189227

1000.1080840.1077630.3774920.232845
10001.714271.4721249.58642.67323
1000034.79519.22263542.7430.3318
100000232.691233.02352846350.414
10000003032.33273.46......(太大、没测)4017.02

自我小结:对随机产生的数组进行排序,1)可以发现插入排序没有优势、特别是数组比较大时耗时太多;2)快速排序、随机化快速排序、归并排序性能不错,然而两种快排比归并排序性能好点;3)当数据量变大时,可以看出性能排序为快速排序、随机化快速排序、归并排序、插入排序;4)由于这里的数组是由随机数产生的,没有显示出随机化快速排序的优势,但是当数组为已排序情况下随机化快排将比快排性能好。

5、参考资料

【1】http://blog.csdn.net/xyd0512/article/details/8259382

【2】/article/1347608.html

【3】/article/6957256.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: