码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2016-03-19 06:18:28      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

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

快速排序使用分治法(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; }

 

 

快速排序

标签:

原文地址:http://www.cnblogs.com/wqkant/p/5294238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!