您的位置:首页 > 其它

快速排序(算法导论实现)

2013-02-28 15:33 190 查看
版本一:

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)

数组划分

快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排:

PARTITION(A, p, r)

1 x ← A[r]

2 i ← p - 1

3 for j ← p to r - 1

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

ok,咱们来举一个具体而完整的例子。

来对以下数组,进行快速排序,

2 8 7 1 3 5 6 4(主元)



一、

i p/j

2 8 7 1 3 5 6 4(主元)

j指的2<=4,于是i++,i也指到2,2和2互换,原数组不变。

j后移,直到指向1..

二、

j(指向1)<=4,于是i++

i指向了8,所以8与1交换。

数组变成了:

i j

2 1 7 8 3 5 6 4

三、j后移,指向了3,3<=4,于是i++

i这是指向了7,于是7与3交换。

数组变成了:

i j

2 1 3 8 7 5 6 4

四、j继续后移,发现没有再比4小的数,所以,执行到了最后一步,

即上述PARTITION(A, p, r)代码部分的 第7行。

因此,i后移一个单位,指向了8

i j

2 1 3 8 7 5 6 4

A[i + 1] <-> A[r],即8与4交换,所以,数组最终变成了如下形式,

2 1 3 4 7 5 6 8

ok,快速排序第一趟完成。

4把整个数组分成了俩部分,2 1 3,7 5 6 8,再递归对这俩部分分别快速排序。

i p/j

2 1 3(主元)

2与2互换,不变,然后又是1与1互换,还是不变,最后,3与3互换,不变,

最终,3把2 1 3,分成了俩部分,2 1,和3.

再对2 1,递归排序,最终结果成为了1 2 3.

7 5 6 8(主元),7、5、6、都比8小,所以第一趟,还是7 5 6 8,

不过,此刻8把7 5 6 8,分成了 7 5 6,和8.[7 5 6->5 7 6->5 6 7]

再对7 5 6,递归排序,最终结果变成5 6 7 8。

ok,所有过程,全部分析完成。

最后,看下我画的图:



#include<iostream>

using namespace std;

void quick_sort(int a[], int begin,int end);

int partition(int a[], int p, int r);

void swap(int &num1,int &num2);

int main(){

int a[]={ 46, 58, 15, 45, 90, 18, 10, 62};

quick_sort(a,0,8);

for ( int i = 0; i < 8; ++i){

cout<<a[i]<<" ";

}

system("pause");

return 0;

}

void swap(int &num1,int &num2)

{

int temp = num1;

num1 = num2;

num2 = temp;

}

//递归调用,当begin 小于 end时候,才进行

//也就是说结束时候只剩下一个元素了,begin大于等于end

//所以下面花括号错了

void quick_sort(int a[], int begin,int end)

{

int q;

if (begin < end){

q = partition(a,begin,end);

}

//还有此时end的值是数组长度,所以这第三个参数应该对应,改成q

quick_sort(a, begin,q -1);

quick_sort(a, q+1,end);

}//insert 

int partition(int a[], int p, int r)

{

int x,i,j;

x = a[r-1];

i = p - 1;

for(j=p;j<=r-2;j++ ){

if(a[j]<=x){

i = i+1;

swap(a[i],a[j]);

}

}

//把数组最后一个元素做为比较的对象,把比他小的放左边,比他大的放右边,等循环到j为r-1的时候结束,

//最后把这个用来比较的元素放在中间

//下面这句话的错误在于是应该把它放中间,所以是 swap(a[i+1],a[r]);

swap(a[i+1],a[j]);

return i + 1;

}//insert

//正确的程序改成下面的:

#include<iostream>
using namespace std;
void quick_sort(int a[], int begin,int end);
int partition(int a[], int p, int r);
void swap(int &num1,int &num2);

int main(){

int a[]={ 46, 58, 15, 45, 90, 18, 10, 62};

quick_sort(a,0,7);

for ( int i = 0; i < 8; ++i){
cout<<a[i]<<" ";
}

return 0;

}

void swap(int &num1,int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;

}
void quick_sort(int a[], int begin,int end)
{
int q;
if (begin < end){
q = partition(a,begin,end);

quick_sort(a, begin,q-1 );
quick_sort(a, q+1,end);
}
}//insert 

int partition(int a[], int p, int r)
{
int x,i,j;
x = a[r];
i = p - 1;
for(j=p;j<=r-1;j++ ){
if(a[j]<=x){
i = i+1;
swap(a[i],a[j]);
}

}

swap(a[i+1],a[j]);

return i + 1;
}//insert 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: