C++数据结构 6 快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014183456/article/details/82957228

快速排序算法是最快的算法,也是最受欢迎的算法。

快速排序采用的是分治法,其平均时间复杂度为O(nlogn)

一趟快速排序的算法是[1]:

  1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;   2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];   3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;   4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换;

  5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)

下面是快速排序的代码:

#include <iostream>

using namespace std;

template<class T>    //使用C++函数模板类
void QuickSort(T *a,const int left,const int right)
{
    //快速排序:建立一个基准,所有的元素和基准进行比较,比基准大的放右边,比基准小的放左边
    //基准可以选最左边的数或者最右边的数,之后依次对左右两边的数进行递归排序
    if(left<right)
    {
    int i=left;
    int j=right+1;  //加一?小技巧可以使后面的比较变得简单
    int privot=a[left];   //选取左边的元素作为基准
    do{
        do i++; while(privot>a[i]);  //左边依次往右递增,直到遇到比基准大的数停止
        do j--; while(privot<a[j]);   //右边的依次往左递减,直到遇到比基准小的数停止
        if(i<=j) swap(a[i],a[j]);   //在两个数没有交叉时,大的数放右边,小的数放左边 ,交换
    }while(i<j);
    swap(a[left],a[j]);  //这一步不要忘了,此时结束循环a[j]的数比基准小,与基准交换
    QuickSort(a,left,j-1);   //对左边的数进行递归
    QuickSort(a,j+1, right);  //对右边的数进行递归
    }
}
int main()
{
    int a[]={0,9,45,78,23,12,45,16,21,32,99}; //最后一个L数是最大的,不做排列使用
    QuickSort(a,0,10);
    for(int i=0;i<10;i++)
        cout<<a[i]<<endl;
     //cout << "Hello world!" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014183456/article/details/82957228