码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法之快速排序

时间:2015-06-09 11:56:17      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:排序算法   快速排序   

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

排序算法之快速排序

标签:排序算法   快速排序   

原文地址:http://blog.csdn.net/adminabcd/article/details/46423933

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!