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

来源:互联网 发布:淘宝微星游戏本旗舰店 编辑:程序博客网 时间:2024/06/05 18:54

快速排序的思想是选取数组中的一个数为分界线,把大于它的数尽量往后放,小于它的数往前放。这样每一趟快速排序都确定一个数的最终位置,并且把数组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");}
0 0
原创粉丝点击