C++实现快排,冒泡,插入,希尔排序,并比较其效率

#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;
} 

Guess you like

Origin blog.csdn.net/cangzhexingxing/article/details/124725351