标签:
#include <iostream> using namespace std; void swap(int *a,int *b) { int temp = *a; *a = *b; *b = temp; } void Grial(int a[],int x,int y) { int i=x-1; int j=x; int key = a[y]; if(x>=y)return ; while(j<y)//这里可以到j<=y,但是后面swap(&a[i+1],&a[j])记忆没有必要了,且if语句中要改成if(a[j]<=key)。 { if(a[j]<key)//=也放到i的右边 { i=i+1; swap(&a[i],&a[j]); } j++; } //j=0,j在不断增加,并且与最后索引值比较,一旦发现a[j]小于key,则将a[j]的值存储在下标为i的位置(i从0开始存货), //直到j=y时,下标小于等于i的都是比key小的,下标大于i的都是比key大的,再将key值与a[i+1]交换,a[i+1]就是这个数组的 //中间值,(i),(i+2)在分别进入函数递归。 swap(&a[i+1],&a[j]); Grial(a,x,i); Grial(a,i+2,y); } int main() { int a[]={2,6,7,1,4,3}; Grial(a,0,5); for(int i=0;i<6;i++) { cout<<a[i]<<" "; } cout<<endl; return 0; }
以下是算法导论上的伪代码
快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排: PARTITION(A, p, r) 1 x ← A[r] //以最后一个元素,A[r]为主元 2 i ← p - 1 3 for j ← p to r - 1 //注,j从p指向的是r-1,不是r。 4 do if A[j] ≤ x 5 then i ← i + 1 6 exchange A[i] <-> A[j] 7 exchange A[i + 1] <-> A[r] //最后,交换主元 8 return i + 1 然后,对整个数组进行递归排序: QUICKSORT(A, p, r) 1 if p < r 2 then q ← PARTITION(A, p, r) //关键 3 QUICKSORT(A, p, q - 1) 4 QUICKSORT(A, q + 1, r)
标签:
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/45055127