本文原始地址:C / C++算法学习笔记(1)-快速排序算法
算法思想:
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。
关于分治法
基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
运用排序
1.分解
已知一个无序的数组a,以其中任意一个元素作为基准(key)(一般取两端的元素)。
第一次分解:从数组末端(索引j)开始,如果遇到比key小的元素,key和a[j]交换,j前移,再从数组前端遍历,遇到比基准大的元素(如果I<J),调换两个数的位置(key和a[i]交换),前端后移,继续下轮循环(分解)。
每一次分解后,分解所取的基准都会位于正确位置(以基准为中心,左边是小于基准的数,右边是大于基准的数-限每次分解的区域)。
2.递归求解
递归进行1所示的分解,每次分解都是在上次基准两侧进行(基准-1/基准+1),直到所有递归执行完。
3.组合
递归结束,组合完成。
算法代码
这里把第一个元素作为基准
- Void QuickSort(int *array,int left,int right)
- {
- If(left< right)//递归结束条件
- {
- Int I,j;
- Int pivot= array[i];//基准点取本次分解第一个元素
- While(i< j)
- {
- While(i<j && array[j]>= pivot) j--;
- If(i<j)
- {
- array [j]=array[i];//两个数交换
- i++;//前端索引+1
- }
- While(i<j && array[i]<= pivot) i++;
- If(i<j)
- {
- array [j]=array[i];//两个数交换
- j--;//后端索引-1
- }
- }
- Array[i] =pivot;//基准点归位
- QuickSort(int *array,left,i-1);//左右两边继续分解
- QuickSort(int *array,i+1, right);
- }
- }
算法视频:第1节:算法:快速排序
本文链接:http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.1.htm