快速排序(算法导论实现)
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
//正确的程序改成下面的:
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
相关文章推荐
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- C++ 快速排序实现(算法导论)
- 【算法导论】快速排序实现
- 【算法导论】用C++实现快速排序
- C++快速排序实现(quicksort) (算法导论)
- 【算法导论】c++实现的随机化的快速排序
- 算法导论——关于快速排序的实现(c语言实现)
- [算法导论] 快速排序以及最大堆的C++实现
- Java实现算法之快速排序
- quick_sort <算法导论>实现
- 【算法导论】十一章散列表11.1-4大数组实现直接寻址方式的字典操作
- 快速排序(算法导论)
- java实现排序算法之交换排序(冒泡排序和快速排序)
- 算法设计之快速排序的实现 (C++实现)
- scala数据结构和算法-04-快速排序实现
- 【算法导论学习-19】1个stack实现queue
- [算法练习]快速排序的C语言实现
- [算法导论]红黑树实现(插入和删除) @ Python
- 【算法导论】c++实现计数排序