快速排序算法 quick sort的理解
最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来,回顾了一下算法导论,也总结了一些经验,写了如下代码(这里是以升序来排列的,但是排序思想就是这样),供大家参考
//用于交换元素位置
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//划分以及元素的交换
int partition(int A[],int L,int R){
//设置移动的下标值,在这个函数的最后
///两个下标值对应的数换位置
int i = L-1,j = L;
///随机取一个作为中间值,将其余与之比较
//int x = Random(L,R);
//swap(A[X],A[R]);
//这里没有这么做,而是直接选取最右边的作为参照
int temp = A[R];
//这一步的理解就是算法的精髓,
///i的坐标表示i以及i前面的都小于temp,
///for循环遍历数组,把小于temp的数置于前面,并且使得i+1
for(;j<R;j++)
{
if(A[j] <= temp)
{
i++;
swap(A[i],A[j]);
};
}
swap(A[i+1],A[j]);
//这一步返回分割点,也就是小于temp的在左边,
///大于temp的在右边
return i+1;
}
//设置逻辑递归
void quickSort(int A[],int L,int R){
//递归条件
if(L <= R){
//取划分得到的当前最佳值作为新的划分点
int temp = partition(A,L,R);
//开始新的排序,是分治法的思想,大问题化作小问题,解决由小及大
//这里的设置要尤其注意用过的temp不能再使用,否则会无限循环递归然后程序奔溃
quickSort(A,L,temp-1);
quickSort(A,temp+1,R);
}
}
算法总结
这个快排是我根据算法导论上的描述写的,加上了自己的一些理解,虽然没有很精辟,如果有不懂的可以私信,有看到就回