快速排序

快速排序

其中第一次分治法调用示意图如下: 



第一种哨兵在结尾:

代码:

#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-1q+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-1q+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-1q+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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值