排序算法之(4)——快速排序

快速排序的思想是选取数组中的一个数为分界线,把大于它的数尽量往后放,小于它的数往前放。这样每一趟快速排序都确定一个数的最终位置,并且把数组list[p,…………,r]分成以list[q]为分界线的两个子数组。一般情况下,我们可以选择数组的最后一个元素作为分界线。
下面用例子说明:假设list[]=1 3 5 7 2 0 9 8 6 4,选取list[r]=list[9]=4为分界线
第一趟快速排序后:【1 3 2 0 】4【7 9 8 6 5】
然后对子数组【1 3 2 0】跟【7 9 8 6 5】使用相同的方法进行快速排序。

【快速排序实现一】

#include<iostream>
using namespace std;
//定义模板函数
template <class T>
void quick(int list[],int p,int q);
template <class T>
int partion(T list[],int p,int r);
template <class T>
void quick(T list[],int p,int r)
{
 if(p<r)
 {
   int q=partion(list,p,r);
   quick(list,p,q-1);
   quick(list,q+1,r);
 }
}
template <class T>
int partion(T list[],int p,int r)
{

    //随机选取一个数与最后一个数交换
   int t=rand()%(r-p+1)+p;
   std::swap(list[t],list[r]);
   T temp=list[r]; //以最后一个数为支点
   int i=p-1;  //这里i记录当前小于等于分界线的最后一个数的位置
   for(int j=p;j<=r-1;j++)
   {
     if(list[j]<=temp)
     {
       i++;
       std::swap(list[i],list[j]);//将第一个大于分界线的数跟不大于分界线的数进行交换
     }
   }
   std::swap(list[i+1],list[r]);  //i+1位置上的数为第一个大于分界线的数
   return i+1;
}
int main()
{
    int list[]={1,3,5,7,2,0,9,8,6,4};
    quick(list,0,9);
    for(int i=0;i<10;i++)
    {
      cout<<list[i]<<" ";
    }
    cout<<endl;
    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值