快速排序
其中第一次分治法调用示意图如下:
第一种哨兵在结尾:
代码:
#include <iostream>
using namespace std;
//把它分成两个部分,不一定是等分的
int PARTITION(int *A , int p , int r)
{
int x = A[r];
int i = p-1;
for(int j = p ;j<r ; j++){//不断和A[r]进行比较
if(A[j]<=x){
i++;//有交换了就往后移一位
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);//因为都是以A[r]为比较对象的,所以A[r]一定是在正确的位置上,不用进入下一次排序!
return(i+1);//返回这个分界点的位置,然后继续递归
}
void QUICKSORT(int *A , int p , int r)
{
if(p<r){
int q =PARTITION(A,p,r);
QUICKSORT(A,p,q-1);//分治法!!
QUICKSORT(A,q+1,r); //因为都是以A[r]为比较对象的,所以A[r]一定是在正确的位置上,不用进入下一次排序!(q-1和q+1的原因)
}
}
//输出
void print(int *A , int p , int r)
{
for(int j = p ; j<=r ; j++){
cout <<A[j] << " ";
}
cout << endl;
}
int main()
{
int i=0,j=0;
int temp,num;
int A[1000];
while(cin >>num){
for(i=0 ;i<num ; i++){
cin>> A[i];
}
QUICKSORT(A,0,num-1);
print(A,0,num-1);
}
return 0;
}
第二种:哨兵在中间
代码:
#include <iostream>
using namespace std;
//把它分成两个部分,不一定是等分的
int PARTITION(int *A , int p , int r)
{
int mid = (p+r)/2;
int x = A[mid];
int i = p , j = r;
while(i != mid && j != mid){
if(A[i]<=x){
swap(A[i],A[mid]);
i++;
}else if(A[j]>=x){
swap(A[j],A[mid]);
j--;
}
}
return(mid+1);//返回这个分界点的位置,然后继续递归
}
void QUICKSORT(int *A , int p , int r)
{
if(p<r){
int q = PARTITION(A,p,r);
QUICKSORT(A,p,q-1);//分治法!!
QUICKSORT(A,q+1,r); //因为都是以A[r]为比较对象的,所以A[r]一定是在正确的位置上,不用进入下一次排序!(q-1和q+1的原因)
}
}
//输出
void print(int *A , int p , int r)
{
for(int j = p ; j<=r ; j++){
cout << A[j] << " ";
}
cout << endl;
}
int main()
{
int i=0,j=0;
int temp,num;
int A[1000];
while(cin >> num){
for(i=0 ; i<num ; i++){
cin >> A[i];
}
QUICKSORT(A,0,num-1);
print(A,0,num-1);
}
return 0;
}
第三种:哨兵在开头:
代码:
#include <iostream>
using namespace std;
//把它分成两个部分,不一定是等分的
int PARTITION(int *A , int p , int r)
{
int x = A[p];
int i = r+1;
for(int j = r ; j>p ; j--){//不断和A[p]进行比较
if(A[j]<=x){
i--;//有交换了就往前移一位
swap(A[i],A[j]);
}
}
swap(A[i-1],A[p]);//因为都是以A[p]为比较对象的,所以A[p]一定是在正确的位置上,不用进入下一次排序!
return(i-1);//返回这个分界点的位置,然后继续递归
}
void QUICKSORT(int *A , int p , int r)
{
if(p<r){
int q = PARTITION(A,p,r);
QUICKSORT(A,p,q-1);//分治法!!
QUICKSORT(A,q+1,r); //因为都是以A[p]为比较对象的,所以A[p]一定是在正确的位置上,不用进入下一次排序!(q-1和q+1的原因)
}
}
//输出
void print(int *A , int p , int r)
{
for(int j = p ; j<=r ; j++){
cout << A[j] << " ";
}
cout << endl;
}
int main()
{
int i=0,j=0;
int temp,num;
int A[1000];
while(cin >> num){
for(i=0 ; i<num ; i++){
cin >> A[i];
}
QUICKSORT(A,0,num-1);
print(A,0,num-1);
}
return 0;
}