快速排序和冒泡排序的时间复杂度分析(C++算法实现对比)
2016-04-07 23:40
691 查看
今天晚上我学习快速排序,快速排序里面涉及到了思想有递归和分治。
快速排序里面最重要的一个变量是哨兵变量,它充当了一个中间值的角色。
然后遍历数组,逐个比较数组中的值跟中间值的大小,小的排在中间值前面,大的排在后面。
不断的二分分治,直到所有的数字都遍历完。
快排的递归分治就完成了。
快排是冒泡排序的一种质的提升,时间复杂度不稳定,在O(nlogn)~O(n`2)之间。
冒泡排序时间稳定在O(n`2)。
我今天晚上用C++写了快排算法和冒泡排序算法,代码如下:
下面是两张快排的测试图:(1000个数字0~9999大小随机数)
下一张图是排序后的数组和时间:中间我休眠了1S
因为要输出2000个数字,所以才要625ms
接下来我把数字调大,随机数生成20000个,修改如下:
然后把休眠1S的代码删去,输出代码删去,下面是两张测试图对比,一张是冒泡排序,一张是快排。分别是时间对比,时间差距很大:
冒泡排序测试结果在下面:
时间差了两个数量级,可见n`2与nlong的时间复杂度的差距真是大。
快速排序里面最重要的一个变量是哨兵变量,它充当了一个中间值的角色。
然后遍历数组,逐个比较数组中的值跟中间值的大小,小的排在中间值前面,大的排在后面。
不断的二分分治,直到所有的数字都遍历完。
快排的递归分治就完成了。
快排是冒泡排序的一种质的提升,时间复杂度不稳定,在O(nlogn)~O(n`2)之间。
冒泡排序时间稳定在O(n`2)。
我今天晚上用C++写了快排算法和冒泡排序算法,代码如下:
#include <iostream> #include <ctime> #include <cstdlib> #include <windows.h> using namespace std; int a[50000]; void qSort(int l,int r)//快速排序 { int x = l; int y = r; int mid = a[(l+r)/2];//中间值,哨兵角色 while(x<y) { while(a[x]<mid) x++; while(a[y]>mid) y--; if(x<=y) { int t = a[x]; a[x] = a[y]; a[y] = t; x++;y--; } } if(x<r) qSort(x,r); if(y>l) qSort(l,y); } void maopao(){ cout<<"-------冒泡排序-------"<<endl; for(int i=0;i<20000;i++){ for(int j=i+1;j<20000;j++){ if(a[i]>a[j]){ int k=a[i]; a[i]=a[j]; a[j]=k; } } } } int main() { double start = GetTickCount(); cout << "run start!" << endl; srand(unsigned(time(0))); for(int i=0;i<20000;i++){ a[i] = rand()%10000; // cout<<a[i]<<" "; } // cout<<"--------快排开始--------"<<endl; // qSort(0,19999); maopao(); // for(int i=0;i<1000;i++){ // cout<<a[i]<<" "; // } double end=GetTickCount(); cout<< "run end!"<<endl; cout << "GetTickCount:" << end-start << endl; return 0; }
下面是两张快排的测试图:(1000个数字0~9999大小随机数)
下一张图是排序后的数组和时间:中间我休眠了1S
因为要输出2000个数字,所以才要625ms
接下来我把数字调大,随机数生成20000个,修改如下:
然后把休眠1S的代码删去,输出代码删去,下面是两张测试图对比,一张是冒泡排序,一张是快排。分别是时间对比,时间差距很大:
冒泡排序测试结果在下面:
时间差了两个数量级,可见n`2与nlong的时间复杂度的差距真是大。
相关文章推荐
- C++第3次作业
- 关于C语言的问卷调查
- 对C语言的知识与能力予以自评
- c语言结构体对齐
- C语言“自守数”问题
- C++作业3
- c++第3次实验-个人所得税计算器
- 第2课 C 到 C++ 的升级
- onvif学习笔记7:一个C++封装的onvif代码的阅读笔记
- C++函数后面加const关键字
- 关于C语言的问卷调查
- C++ 流输入输出运算符重载
- C++实验3—个人所得税计算器
- --------关于C语言的问卷调查-----------
- 关于C语言的问卷调查
- 关于C语言的问卷调查
- 以c++的方式实现单链表
- C++四则运算代码
- C++ Primer Plus (第6版)课后习题答案 第二章
- C++基本知识