C++ 排序(未完)

参考:

快速排序

堆排序

各类排序

#include <iostream>
#include <vector>
#include <time.h>
#include <cstdlib>
//......自行添加其他必要的库
using namespace std;
#define num 100
//各种排序方法的函数声明,有兴趣选做注释部分排序算法
//template<class T>
//void BubbleSort(vector<T> &x);//冒泡排序
//template<class T>
//void SelectSort(vector<T> &x);//选择排序
//template<class T>
//void InsertSort(vector<T> &x);//插入排序
//template<class T>
//void ShellSort(vector<T> &x);//希尔排序
//template<class T>
//void CountedSort(vector<T> &x);//计数排序
//template<class T>
//void RadixSort(vector<T> &x);//基数排序
//template<class T>
//void BSTSort(vector<T> &x);//选做:二叉查找树排序


template<class T>
void QuickSort(vector<T> &x, int first, int end);//快速排序
template<class T>
void HeapSort(vector<T> &x);//堆排序
template<class T>
void Heapfy(vector<T> &x, int first, int end); //堆调整

template<class T>
void Display(vector<T> &x);
template<class T>
void ResetData(vector<T> &x,vector<T> &y);//使用y重置x
//......自行添加其他必要的函数声明
int main()
{
    clock_t  start,finish;
    double totaltime;
    
    vector<int> a(num+1),b(num+1);
    int i;
    srand(time(0));//随机数种子初始化
    
    for(i=1;i<=num;i++)
    {    a[i]=rand()%10000+1; //随机生成1-10000内的数值作为排序对象
        b[i]=a[i];
    }
    
    //排序前显示数据
    cout<<"排序前"<<endl;
    Display(a);
    //冒泡排序
    //  BubbleSort(a);
    //cout<<"冒泡排序后"<<endl;
    //Display(a);
    //选择排序
    //  ResetData(a,b);
    //    SelectSort(a);
    //    cout<<"选择排序后"<<endl;
    //    Display(a);
    //插入排序
    //    ResetData(a,b);
    //    InsertSort(a);
    // cout<<"插入排序后"<<endl;
    //    Display(a);
    //希尔排序
    //  ResetData(a,b);
    //    ShellSort(a);
    //    cout<<"希尔排序后"<<endl;
    //    Display(a);
    //计数排序
    //   ResetData(a,b);
    //    CountedSort(a);
    //    cout<<"计数排序后"<<endl;
    //    Display(a);
    //基数排序
    //   ResetData(a,b);
    //    RadixSort(a);
    //    cout<<"基数排序后"<<endl;
    //    Display(a);
    //快速排序
 
    ResetData(a,b);
    start = clock();
    QuickSort(a,0,num);
    finish = clock();
    cout<< endl << "快速排序后"<<endl;
    totaltime = (double)(finish-start)/CLOCKS_PER_SEC;
    cout << "time: " << totaltime << "s" << endl;
    Display(a);
 
    
     //堆排序
    ResetData(a,b);
    start = clock();
    HeapSort(a);
    finish = clock();
    cout<< endl << "堆排序后"<<endl;
    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
    cout << "time: " << totaltime << "s" << endl;
    Display(a);
    cout << endl;
}

template<class T>
void Display(vector<T> &x)
{
    for(int i=1;i<=num;i++)
    {    cout<<x[i]<<" ";
        if(i%15==0) cout<<endl;
    }
}

template<class T>
void ResetData(vector<T> &x,vector<T> &y)//使用y重置x
{
    for(int i=1;i<=num;i++)
    {
        x[i]=y[i];
    }
}

template<class T>
void QuickSort(vector<T> &x, int first, int end){
    if( first<end ){
        int i=first;
        int j=end;
        T t=x[i];
        while( i<j ){
            while( i<j && x[j] >= t ){
                j--;
            }
            if( i<j ){
                x[i++] = x[j];
            }
            while( i<j && x[i] <= t){
                i++;
            }
            if( i<j ){
                x[j--] = x[i];
            }
        }
        x[i] = t;
        QuickSort(x, first, i-1);
        QuickSort(x, i+1, end);
    }
}

template<class T>
void Heapfy(vector<T> &x, int p, int len){
    int father = p;
    int child = 2*father;
    while( child<=len ){
        if( child+1 <= len && x[child] < x[child+1] ){
            child++;
        }
        if( x[child] > x[father] ){
            int t=x[child];
            x[child] = x[father];
            x[father] = t;
            father = child;
            child = 2*father;
        }
        else break;
    }
}

template<class T>
void HeapSort(vector<T> &x){
    for(int i=num/2; i>=1; i--){ //构造最大堆,但子结点左右孩子大小不分
        Heapfy(x, i, num);
    }
    for(int i=num; i>1; i--){ //构造最小堆,使得最左孩子小于右孩子
        int t=x[1];
        x[1] = x[i];
        x[i] = t;
        Heapfy(x,1,i-1);
    }
}

猜你喜欢

转载自www.cnblogs.com/fitzroy343/p/10207947.html