跳转至

排序——快速排序

#include <iostream>
#include <vector>
using namespace std;

//插入排序的实现,在数据量较小时效率优于快排
template<class T>
void insertSort(vector<T> &a)
{
    int k;
    T tmp;

    for(int j = 1; j < a.size(); ++j){
        tmp = a[j];
        for(k = j - 1; tmp < a[k] && k >=0; --k){
            a[k+1] = a[k];    
        }
        a[k+1] = tmp;
    }
}

// 返回left, center,right三项中的中值
// 将他们排序并隐匿枢纽元
template<class T>
const T &median(vector<T> &a, int left, int right)
{
    int center = (left + right) / 2;

    if(a[center] < a[left])
        swap(a[left], a[center]);
    if(a[right] < a[left])
        swap(a[left], a[right]);
    if(a[right] < a[center])
        swap(a[center], a[right]);

    swap(a[center], a[right - 1]);

    return a[right - 1];
}

// a为数组,left为子数组最左元素下标,right为最右元素的下标
template<class T>
void quickSort(vector<T> &a, int left, int right)
{
    //判断数组规模
    if(left + 10 <= right){
        const T &pivot = median(a, left, right);
        //开始分割
        int i = left, j = right - 1;
        for( ; ; ){
            while(a[++i] < pivot){}
            while(pivot < a[--j]){}
            if(i < j) swap(a[i], a[j]);
            else break;
        }

        swap(a[i], a[right - 1]); //恢复枢纽元

        quickSort(a, left, i - 1); //将小于等于枢纽元的元素排序
        quickSort(a, i + 1, right); //将大于等于枢纽元的元素排序
    }
    else{
        insertSort(a);
    }
}

// 快速排序算法的驱动程序
template<class T>
void quickSort(vector<T> &a)
{
    quickSort(a, 0, a.size() - 1);
}

int main()
{
    vector<int> a = {9,8,7,6,5,4,3,2,1};

    quickSort(a);

    for(int i = 0; i < a.size(); ++i)
        cout << a[i] << '\t' ;

    return 0;
}