闲着没事,做个小小的测试,测试一下冒泡,选择,插入和快速四种排序对同一个含有1000000个元素的数组排序所用的时间,做个比较。
四种排序的代码如下:
冒泡排序:
template
void bubble_sort(T a[], int num){
if(num ==0 || num == 1)
return ;
bool changed = false;
do{
for(int i=0; i
选择排序:
template
void select_sort(T a[], int num){
T min;
int locate;//最小值位置
for(int i=0; i
插入排序:
template
void insert_sort(T a[], int num){
int j;
int temp;//暂存无序区待插入元素
for(int i=1; i 0 && temp < a[j-1]/*如果小于有序区被比较元素*/){
//则将有序区元素后移
a[j] = a[j-1];
//将被比较元素前移一位
--j;
}
//将待插入元素插入相应位置
a[j] = temp;
}
}
快速排序:
template
void quick_sort(T a[], int num)
{
//如果一个元素,不用排
if(num ==1)
return ;
//如果只有两个元素没必要分界
if(num == 2){
if(a[1] < a[0])
swap(a[1], a[0]);
return ;
}
//取中间元素为界,希望可以将两部分尽量分的均匀一些
swap(a[num/2], a[0]);
T bound = a[0];
//声明左右两个指针变量
T* L = a+1;
T* R = a+num-1;
//作比较,不合适的交换,直至一趟排序完成
while(L < R){
while(L < R && *L < bound)
++L;
while(R >= L && *R > bound)
--R;
if(L < R)
swap(*L, *R);
}
if(*R < bound)
swap(*R, *a);
//递归排序两个分开的子序列
quick_sort(a, R-a);
quick_sort(R+1, num-1-(R-a));
}
测试程序如下:
#include
using namespace std;
#include
int main()
{
const int N=100000;
int a[N];
while(1){
for(int i=0; i> choice;
switch(choice)
{
case 1:
t1 = clock();
bubble_sort(a, N);
t2 = clock();
break;
case 2:
t1 = clock();
insert_sort(a, N);
t2 = clock();
break;
case 3:
t1 = clock();
select_sort(a, N);
t2 = clock();
break;
case 4:
t1 = clock();
quick_sort(a, N);
t2 = clock();
break;
}
cout << double(t2-t1)/CLOCKS_PER_SEC << endl;
}
return 0;
}
测试结果如下图:
从上图可以看出,快排确实很快,冒泡让人无语,插入比选择稍快一些。