发表时间:2022-03-26来源:网络
最近复习java,做到快速排序,特意来写个教程。帮助大家弄懂里面最重要的几点。
思想分三步走:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
第一步非常简单,没有特殊要求下统一把数组的第一个数作为基准。
第二步注意放的操作,到底要怎么放?
以一个数组作为示例,取区间第一个数为基准数。
初始时,l = 0; r = 9; temp = a[l] = 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–;
数组变为:
l = 3; r = 7; temp=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; l++;
从i开始向后找,当i=5时,由于i==j退出。
此时,l= r = 5,而a[5]刚好又是上次挖的坑,因此将temp填入a[5]。
数组变为:
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
对挖坑填数进行总结:
1.l =left; r = right; 将基准数挖出形成第一个坑a[i]。
2.r–由后向前找比它小的数,找到后挖出此数填前一个坑a[l]中。
3.l++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[r]中。
4.再重复执行2,3二步,直到r==l,将基准数填入a[l]中。
第三步:非常重要!注意给出递归出口!!!
if (left >= right) { //一定要给出递归出口!! return; }下面是Java的整体实现代码,亲测可过!
public class mysort { public static void main(String[] args) { int[] a={2,2,2,1,10}; mysort1(a,0,a.length-1); //数组给的right千万别越界!! for (int i:a) { System.out.println(i); } } public static void mysort1(int[] a,int left,int right) { if (left >= right) { //一定要给出递归出口!! return; } int r=right; int l=left; int temp=a[l]; while ((l //从右开始,找到一个小于temp的数的下表 r--; } if(l // 找到大于temp的数 l++; } if(l
苏宁微店卖家版app(苏宁推客)下载v9.8.40 安卓最新版
57.19MB |生活服务
机友邦工程机械网官方版app下载v4.0.4 安卓版
88.56MB |系统工具
苏宁微店客户端(改名苏宁推客)下载v9.8.40 安卓版
57.19MB |生活服务
优腿商家端app下载v1.23.5 安卓版
34.13MB |系统工具
龙湖物业app下载v1.20.0 安卓版
84.54MB |生活服务
moon月球手机版下载v2.6.5 安卓版
51.55MB |生活服务
邻里掌柜app官方版下载v8.12.3 安卓版
151.25MB |生活服务
药采采app官方版下载v2.6.3 安卓版
31.88MB |生活服务