c++实现冒泡、选择、希尔、快速排序算法及比较

529 阅读2分钟

前言

比较几个排序算法运行效率,10万个随机数.

运行截图

1

代码

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