菜鸟和你一起学“快速排序” 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);//对右段排序
}
好了,讲到这里代码就讲完了,大家如果想要弄清楚里边的流程和思想,最好找几个比较简单的例子,亲自跑一下,在纸上画一画,就简单明了了~就这样,谢谢大家。
快速排序的思想是这样子的:它是运用了分而治之的思想,把一个问题分开成几个小部分分别解决,然后重组。在快速排序中,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);//对右段排序
}
好了,讲到这里代码就讲完了,大家如果想要弄清楚里边的流程和思想,最好找几个比较简单的例子,亲自跑一下,在纸上画一画,就简单明了了~就这样,谢谢大家。
相关文章推荐
- c++ 实现的俄罗斯方块 期待和你一起改进
- C++快速排序实现(quicksort)
- 菜鸟学习c++—实现简单的冒泡排序和插入排序算法
- 用C++实现快速排序
- C++快速排序实现(quicksort) (算法导论)
- C++模板实现快速排序
- C++快速排序的实现
- C++实现快速排序(源代码)
- 【算法导论】用C++实现快速排序
- c++实现快速排序
- C++实现快速排序(源代码)
- C++实现快速排序
- C++模板实现快速排序
- C++实现快速排序(源代码)
- 算法设计之快速排序的随机化版本 (C++实现)
- 【C++】boost::bind和函数对象一起使用实现便捷的异步编程
- C++实现快速排序
- 快速排序和插入排序的C++实现
- 快速排序实现_c++
- c++快速排序的实现