快速排序
Posted wqkant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为"基准"(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
- 递归地(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; }
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章