您的位置:首页 > 编程语言 > C语言/C++

菜鸟和你一起学“快速排序” C++实现

2013-05-04 16:55 162 查看
生活不菜,菜鸟不菜。大家好,又和大家见面了,最近看了一下快速排序,首先说一下,快速排序的思想。

快速排序的思想是这样子的:它是运用了分而治之的思想,把一个问题分开成几个小部分分别解决,然后重组。在快速排序中,n个元素被分为三段:左段left,右段right和中段middle。中段仅包含一个元素。左段中的各个元素都小于中段的元素,右段的各元素都大于中段元素。因此left和right中的元素可以独立排序,并且不必对left和right的排序结果进行合并(左段排好+中段+右段排好=有顺序的数组,不用再合并重组)。middle中的元素被称为支点(pivot)。

下面首先给大家看一下快速排序的伪代码。

//使用快速排序方法对a[0:n-1]排序

从a[0:n-1]中选择一个元素作为middle,该元素为支点。

把余下的元素分割为两段作为left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点。

递归的使用快速排序方法对left进行排序。

递归的使用快速排序方法对right进行排序。

所得结果为left+middle+right

以上就是思想+伪代码,下面举一个例子,然后我们一起写一下代码。

例如元素序列[4,8,3,7,1,5,6,2]。假设选择元素6作为支点,则6位于middle;4,3,1,5,2位于left;8,7位于right;当left排好序后,所得结果为1,2,3,4,5;当right排好序后结果为7,8。把right中的元素放在支点元素之后,left中的元素放在支点元素之前,即可得到最终的结果[1,2,3,4,5,6,7,8,]。

下面我们一起写一下代码

template<class T>

void QuickSort(T* a,int n)

{//对a[0:n-1]进行快速排序

{//要求a
必须有最大关键值

quickSort(a,0,n-1);

template<class T>

void quickSort(T a[],int l,int r)

{

if(l<=r) return;//递归结束的标志。

int i=l; //从左到右的游标。

int j=r+1; //从右往左的游标。

pivot=a[l]; //设置middle的元素,一般为将要被排序元素的第一个元素。

//把左侧>=pivot的元素与右侧<=pivot的元素进行交换

while(true){

do{//在左侧寻找>=pivot的元素

i=i+1;

}while(a[i]<pivot);

do{//在右侧寻找<=pivot

j=j-1;

}while(a[j]>pivot);

if(i>=j)break;//未发现交换对象

Swap(a[i],a[j]);

}

//设置pivot

a[l]=a[j];

a[j]=pivot;

quickSort(a,l,j-1);//对左段排序

quickSort(a,j+1,r);//对右段排序

}

好了,讲到这里代码就讲完了,大家如果想要弄清楚里边的流程和思想,最好找几个比较简单的例子,亲自跑一下,在纸上画一画,就简单明了了~就这样,谢谢大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: