#include <iostream>
#include <vector>
#include <random>
#include <stdlib.h>
#include <time.h>
#include <cstdio>
using namespace std;
//冒泡排序
long Bubble(vector<int> &vec){
double startTime1 = clock();//1计时开始
int size=vec.size();
long total=0;
for(int i=0;i<size-1;i++){
for(int j=0;j<size-1-i;j++){
total++;
if(vec[j]>vec[j+1])
{swap(vec[j],vec[j+1]);}
}
}
double endTime1 = clock();//1计时结束
cout << "冒泡排序的时间为 " <<(double)(endTime1 - startTime1) / CLOCKS_PER_SEC << "s" <<endl;
return total;
}
//插入排序
long InsertSort(vector<int> &vec){
double startTime2 = clock();//2计时开始
int size=vec.size();
long ans=0;
int temp,j;
for(int i=1;i<size;i++){ //外层循环:size-1次
temp=vec[i]; //取出下一个元素:i=1
j=i-1; //与前面的已排序的i-1个元素依次进行比较,找到自己存放的位置
for(j;j>=0;j--){
ans++;
if(vec[j]>=temp){ vec[j+1]=vec[j];}
else break;
}
vec[j+1]=temp;
}
double endTime2 = clock();//2计时结束
std::cout << "插入排序的时间为 " <<(double)(endTime2 - startTime2) / CLOCKS_PER_SEC << "s" << std::endl;
return ans;
}
//希尔排序
long ShellSort(vector<int>&vec){
double startTime1 = clock();//1计时开始
long total=0;
for(int gap=vec.size()/2;gap>0;gap/=2){
for(int i=gap;i<vec.size();++i){
int j=i;
while(j-gap>=0 && vec[j-gap]>vec[j]){
total++;
swap(vec[j-gap],vec[j]);
j=j-gap;}
}
}
double endTime1 = clock();//1计时结束
std::cout << "希尔排序的时间为 " <<(double)(endTime1 - startTime1) / CLOCKS_PER_SEC << "s" << std::endl;
return total;
}
//快速排序
long QuickSort(vector<int>&vec,int low,int high) {
static long sum=0;
if(low>=high){
return sum;
}
int first=low;
int last=high;
int temp=vec[first];
while(first<last){
while(first<last&&vec[last]>=temp){
last--;sum++;
}
if(first<last) vec[first]=vec[last];
while(first<last&&vec[first]<=temp){
first++;sum++;
}
if(first<last)vec[last]=vec[first];
}
vec[first]=temp;
QuickSort(vec,low,first-1);
QuickSort(vec,first+1,high);
}
long quicksort(vector<int>&v){
static long t1=0,t2=0;
double startTime2 = clock();//2计时开始
long sum=QuickSort(v,0,v.size());
double endTime2 = clock();//2计时结束
std::cout << "快速排序的时间为 " <<(double)(endTime2 - startTime2) / CLOCKS_PER_SEC << "s" << std::endl;
t2=sum-t1;
t1=sum;
return t2;
}
void swap(int &val1,int &val2){
int temp=val1;
val1=val2;
val2=temp;
}
void creat1(vector<int>&vec,int n){
for(int i=0;i<n;i++)
vec[i]=n-i;
}
void creat2(vector<int>&vec,int n){
for(int i=0;i<n;i++)
vec[i]=i+1;
}
void creat3(vector<int>&vec,int n){
srand((int)time(0));
for(int i=0;i<n;i++)
vec[i]=rand()%n;
}
void print(vector<int>&vec){
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ,";
if((i+1)%20==0)cout<<endl;
}
}
int main(){
vector<int> v1(10000),v2(10000),v3(10000),v4(10000);
long t1,t2,t3,t4;
int n=v1.size();
creat1(v1,n);
creat1(v2,n);
creat1(v3,n);
creat1(v4,n);
cout<<"反序序列"<<endl;
t1=Bubble(v1);
t4=InsertSort(v4);
t2=ShellSort(v2);
t3=quicksort(v3);
cout<<"冒泡总共循环了 "<<t1<<" 次"<<endl;
cout<<"插入总共循环了 "<<t4<<" 次"<<endl;
cout<<"希尔总共循环了 "<<t2<<" 次"<<endl;
cout<<"快排总共循环了 "<<t3<<" 次"<<endl;
cout<<endl;
creat2(v1,n);
creat2(v2,n);
creat2(v3,n);
creat2(v4,n);
cout<<"正序序列"<<endl;
t1=Bubble(v1);
t4=InsertSort(v4);
t2=ShellSort(v2);
t3=quicksort(v3);
cout<<"冒泡总共循环了 "<<t1<<" 次"<<endl;
cout<<"插入总共循环了 "<<t4<<" 次"<<endl;
cout<<"希尔总共循环了 "<<t2<<" 次"<<endl;
cout<<"快排总共循环了 "<<t3<<" 次"<<endl;
cout<<endl;
creat3(v1,n);
v2=v1;
v3=v1;
v4=v1;
cout<<"随机序列1"<<endl;
t1=Bubble(v1);
t4=InsertSort(v4);
t2=ShellSort(v2);
t3=quicksort(v3);
cout<<"冒泡总共循环了 "<<t1<<" 次"<<endl;
cout<<"插入总共循环了 "<<t4<<" 次"<<endl;
cout<<"希尔总共循环了 "<<t2<<" 次"<<endl;
cout<<"快排总共循环了 "<<t3<<" 次"<<endl;
cout<<endl;
creat3(v1,n);
v2=v1;
v3=v1;
v4=v1;
cout<<"随机序列2"<<endl;
t1=Bubble(v1);
t4=InsertSort(v4);
t2=ShellSort(v2);
t3=quicksort(v3);
cout<<"冒泡总共循环了 "<<t1<<" 次"<<endl;
cout<<"插入总共循环了 "<<t4<<" 次"<<endl;
cout<<"希尔总共循环了 "<<t2<<" 次"<<endl;
cout<<"快排总共循环了 "<<t3<<" 次"<<endl;
cout<<endl;
return 0;
}
C++实现快排,冒泡,插入,希尔排序,并比较其效率
Guess you like
Origin blog.csdn.net/cangzhexingxing/article/details/124725351
Ranking