duyifei0 2019-06-27
数组:[2,6,3,6,5,9,1]
输出:[1 2 3 5 6 6 9 ]
private static void paixu(int[] arrs, int h, int e) { int head =h; int end = e; int x=(h+e)/2;//中间值的位置 while (h <= e){//两个指针还没有遇到 while (arrs[x]>arrs[h]){//从左边开始找,找到比中间值大的数 h++; } while (arrs[x]< arrs[e]){//从右边开始查找,找到比中间值小的 e--; } //交换值 int m; m = arrs[h]; arrs[h] = arrs[e]; arrs[e] = m; //2,6,3,6,5,9,1 h++; //2,1,3,6,5,9,6 e--; //2,1,3,5,6,9,6 } //递归查询左右两边 if (head < e){ paixu(arrs,head,e);} if (end > h){ paixu(arrs,h,end);} }
为什么会有h++,e--呢
跟一下代码
输入数组[2,6,3,6,5,9,1]
第一次运行
中间位置是3,值是6
左边是0,右边是6
往下执行
h=1,e=6
数组变成[2,1,3,6,5,9,6]
执行加减操作 h=2,e=5;然后开启第二轮的执行
假如不进行加减操作,
继续执行的话,左边继续判断,当查询到6的时候停止,
右边查询,查询到6的时候停止,然后交换,6和6交换,然后再次开启循环,就会死循环,
当执行加减操作之后,再次判断的时候,就会从交换数据之后的索引开始判断,就不会再次判断了,
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。