1 public static int adjustArray(int[] a, int first, int last){ 2 int i = first; 3 int j = last; 4 //取第一个数为基准数,也就是第一个坑 5 int x = a[i]; 6 while (i < j){ 7 //从右向左找小于x的数来填坑 8 //a[j]等于x或比x大则继续往左找 9 while (i < j && a[j] >= x){ 10 j--; 11 } 12 //当找到a[j]比x小的数时,要先判断此时i是否小于j 13 //然后把a[j]填入a[i]中,此时a[j]成为新的坑 14 if (i < j){ 15 a[i] = a[j]; 16 i++; 17 } 18 //接着从左往右找大于等于x的数来填坑 19 //a[i]比x小则继续往右找 20 while (i < j && a[i] < x){ 21 i++; 22 } 23 //当找到a[i]大于等于x的数时,要先判断此时i是否小于j 24 //然后把a[i]填入a[j]中,此时a[i]成为新的坑 25 //然后这整个过程一直持续到i = j的时候退出 26 if (i < j){ 27 a[j] = a[i]; 28 j--; 29 } 30 } 31 //退出时,i = j,最后将x填到这个坑中 32 a[i] = x; 33 //返回的这个数为基准数最后落到的坑的位置,此时,基准数前面的数都比它小,后面的数都比他大 34 //接下来要做的事情,是对基准数左边的部分和右边的部分重复这个方法 35 return i; 36 } 37 38 public static void quick_sort1(int[] a, int first, int last){ 39 //刚开始肯定first比last小的,毕竟fisrt是0,last是a.length - 1; 40 if (first < last){ 41 int i = adjustArray(a, first, last); 42 //然后不断递归对i位置左边的那部分和i位置右边那部分调用此方法 43 //直到调用不了为止,就排好序了 44 quick_sort1(a, first, i - 1); 45 quick_sort1(a, i + 1, last); 46 } 47 } 48 49 //将以上两个方法合起来就是: 50 public static void quick_sort(int[] a, int first, int last){ 51 if (first < last){ 52 int i = first; 53 int j = last; 54 int x = a[i]; 55 while (i < j){ 56 while (i < j && a[j] >= x){ 57 j--; 58 } 59 if (i < j){ 60 a[i] = a[j]; 61 i++; 62 } 63 while (i < j && a[i] < x){ 64 i++; 65 } 66 if (i < j){ 67 a[j] = a[i]; 68 j--; 69 } 70 } 71 a[i] = x; 72 quick_sort1(a, first, i - 1); 73 quick_sort1(a, i + 1, last); 74 } 75 }
Written on October 16th, 2019