前言
比较几个排序算法运行效率,10万个随机数.
运行截图
代码
#include <iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
void display(int *arr,int n)
{
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
cout<<"\n";
}
//数组拷贝
int *copyArr(int *arr,int n)
{
int *num= (int *) malloc(sizeof(int)*(n+10));//数组初始化;
for(int i=0;i<n;i++)
{
num[i]=arr[i];
}
return num;
}
//获得逆向数组
int *getReverseArr(int *arr,int n)
{
int *num= (int *) malloc(sizeof(int)*(n+10));//数组初始化;
for(int i=n-1,j=0;i>=0;i--,j++)
{
num[j]=arr[i];
}
return num;
}
//获得随机数组
void getRandomArr(int *arr,int n)
{
for(int i=0;i<n;i++)
arr[i]=rand()%n;//产生0-n的随机数
}
//冒泡排序
void miaoSort(int *arr,int n)
{
for(int i=0;i<n;i++)
for(int j=1;j<n-i;j++)
{
if(arr[j-1]>arr[j])
{
arr[j-1] = arr[j-1]^arr[j];
arr[j] = arr[j-1]^arr[j];
arr[j-1] = arr[j-1]^arr[j];
}
}
}
//选择排序
void xuanSort(int *arr,int n)
{
for(int i=0;i<n;i++)
{
int index = i;
for(int j=i+1;j<n;j++)
{
if(arr[index]>arr[j])
{
index = j;
}
}
arr[index] = arr[i]^arr[index];
arr[i] = arr[i]^arr[index];
arr[index] = arr[i]^arr[index];
}
}
//希尔排序
void sellSort(int *arr,int n)
{
int step = n/5+1;//设置步长
while(step)
{
for(int i=step;i<n;i++)
{
int num = arr[i];
int j = i;
while(j>=step&&num<arr[j-step])
{
arr[j]=arr[j-step];
j=j-step;
}
arr[j]=num;
}
step/=5;//除以增量
}
}
int position(int *arr,int left,int right)
{
if(left>=right)
{
return left;
}
int i,j,base;
i = left,j = right;
base = arr[left];
while(i!=j)
{
while(arr[j]>=base&&i<j)
j--;
while(arr[i]<=base&&i<j)
i++;
if(i<j)
{
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}
}
arr[left] = arr[i];
arr[i] = base;
return i;
}
//快排非递归,因为逆序排列递归过深会造成溢出
void quickSort(int *arr,int left,int right,int n)
{
int *stackArr = (int*)malloc(sizeof(int)*10*n);
int top = 0;
int par = position(arr,left,right);
//入栈
if(par>left+1){
stackArr[top++]=left;
stackArr[top++]=par-1;
}
if(par<right-1){
stackArr[top++]=par+1;
stackArr[top++]=right;
}
while(top>0)
{
right=stackArr[--top];
left=stackArr[--top];
par=position(arr,left,right);
if(par>left+1){
stackArr[top++]=left;
stackArr[top++]=par-1;
}
if(par<right-1){
stackArr[top++]=par+1;
stackArr[top++]=right;
}
}
}
int main()
{
int *arrTemp;
int n = 100000;
int *arr=(int *) malloc(sizeof(int)*(n+10));//数组初始化
clock_t startTime,endTime;
srand((unsigned)time(NULL)); //随机数初始化
getRandomArr(arr,n);
cout<<"--------------冒泡排序------------------"<<endl;
arrTemp = copyArr(arr,n);
startTime = clock();
miaoSort(arrTemp,n);
endTime = clock();
cout<<"数组大小n="<<n<<",算法运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
arrTemp = getReverseArr(arrTemp,n);
startTime = clock();
miaoSort(arrTemp,n);
endTime = clock();
cout<<"数组完全反序运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
cout<<"\n--------------选择排序------------------"<<endl;
arrTemp = copyArr(arr,n);
startTime = clock();
xuanSort(arrTemp,n);
endTime = clock();
//display(arrTemp,20);
cout<<"数组大小n="<<n<<",算法运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
arrTemp = getReverseArr(arrTemp,n);
startTime = clock();
xuanSort(arrTemp,n);
endTime = clock();
cout<<"数组完全反序运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
cout<<"\n--------------希尔排序------------------"<<endl;
arrTemp = copyArr(arr,n);
startTime = clock();
sellSort(arrTemp,n);
endTime = clock();
//display(arrTemp,20);
cout<<"数组大小n="<<n<<",算法运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
arrTemp = getReverseArr(arrTemp,n);
startTime = clock();
sellSort(arrTemp,n);
endTime = clock();
cout<<"数组完全反序运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
cout<<"\n--------------快速排序------------------"<<endl;
arrTemp = copyArr(arr,n);
startTime = clock();
quickSort(arrTemp,0,n-1,n);
endTime = clock();
//display(arrTemp,20);
cout<<"数组大小n="<<n<<",算法运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
arrTemp = getReverseArr(arrTemp,n);
startTime = clock();
quickSort(arrTemp,0,n-1,n);
endTime = clock();
//display(arrTemp,20);
cout<<"数组完全反序运行时间:"<<((double)(endTime-startTime)/CLOCKS_PER_SEC)<<"s"<<endl;
return 0;
}