快速排序

Posted wqkant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

技术分享
技术分享
技术分享

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个演算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

技术分享
示例:
技术分享
#include<iostream>
#include<vector>
using namespace std;

void Swap(int &p,int &q){                                                       
    int temp = p;
    p=q;
    q=temp;
} //引用操作同一块空间

int partition(vector<int>& A,int left,int right){
    int privotValue=A[right];//privotValue 主元值
    int i=left-1;//storeIndex
    for(int j=left;j<=right-1;j++){
        if(A[j]<=privotValue){
            i=i+1;
            swap(A[i],A[j]);
        }
    }
    swap(A[i+1],A[right]);
    return i+1;
}
void quicksort(vector<int>& A,int left,int right){
    if(left<right){
        int prviotNewValue=partition(A,left,right);
        quicksort(A,left,prviotNewValue-1);
        quicksort(A,prviotNewValue+1,right);
    }
}
int main(){
    vector<int> A;
    int n;
    while(cin>>n)
        A.push_back(n);
    quicksort(A,0,A.size()-1);
    for(int i=0;i<A.size();i++)
        cout<<A[i]<<" ";
    cout<<endl;
  return 0; }

 

 

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

快速排序

05-快速排序

6.5 快速排序

排序算法之快速排序

快速排序

C语言-排序算法——快速排序