排序算法——快速排序
来源:互联网 发布:武汉大学网络教育试题 编辑:程序博客网 时间:2024/06/09 17:08
步骤:
1.先分割
2.再递归调用进行切分排序
快速排序的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:
先来看实例吧,定义下面再给出(最好能用自己的话来总结定义,这样对实现代码会有帮助)。
以一个数组作为示例,取区间第一个数为基准数。
0
1
2
3
4
5
6
7
8
9
72
6
57
88
60
42
83
73
48
85
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;
数组变为:
0
1
2
3
4
5
6
7
8
9
48
6
57
88
60
42
83
73
88
85
i = 3; j = 7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:
0
1
2
3
4
5
6
7
8
9
48
6
57
42
60
72
83
73
88
85
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
对挖坑填数进行总结
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
照着这个总结很容易实现挖坑填数的代码:
package suanfa;public class QuickSort {public static void sort(int[] a,int left,int right){int i;if(left<right){i=div(a,left,right);//先分割sort(a,left,i-1);//递归调用左边排序sort(a,i+1,right);//递归调用右边排序}}public static int div(int[] a,int left,int right)//分割,确定分割点{int base=a[left];//左边元素作为参考点while(left<right)//循环条件{while(left<right&&a[right]>base)//把比基准数小的放到左边right--;a[left]=a[right];while(left<right&&a[left]<base)//把比基准数大的放到右边left++;a[right]=a[left];}a[left]=base;//直到left=right,把基准数放到leftreturn left;}public static void main(String[] args) {int[] a={1,7,8,9,2,3,4,5};QuickSort.sort(a, 0, a.length-1);for(int i=0;i<a.length;i++){System.out.print(a[i]+",");}}}
- 排序算法—快速排序
- 排序算法—快速排序
- 排序算法———快速排序
- 排序算法(一)——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法5——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- c++排序算法——快速排序
- 算法——排序之快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- STL待学习笔记
- PHP单文件上传(含封装函数)
- 2017面试笔试题总结(58、滴滴、百度、中兴、美团等)
- 探析 — 反射
- 数据结构之“串”
- 排序算法——快速排序
- Robot FrameWork UI自动化脚本稳定性与原生关键字
- hdu 2665 Kth number(主席树模板)
- 关于子网掩码的一点理解
- 动态规划-直方图内最大矩形
- 页面置换算法
- fpga hdmi接收和发送部分调试
- ASN.1规则中Boolean和bitstring编码方式的简介
- wireshark抓包分析