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