闲来重写一下快速排序
还是写一下原理吧:
有图为证:
下图为原理示意图
package Alrithm; public class Quick { public static void sort(int[] arr, int low, int high) { int min = low;// 用于动态移动角标 int max = high;// 用于动态移动角标 if (low < high) {// 元素大于一个才进行排序 int temp = arr[low];// 定义基数 while (min < max) {// 在角标重合时跳出循环 // 新从最大值开始 while (min < max && arr[max] > temp) {// 右边的数大于基数时,max-- max--; } // 减完之后在换位置 int tmp = arr[min]; arr[min] = arr[max]; arr[max] = tmp; // 再从最小值开始 while (min < max && arr[min] < temp) { min++; } int tmp1 = arr[min]; arr[min] = arr[max]; arr[max] = tmp1; } sort(arr, low, min - 1); sort(arr, min + 1, high); } } public static void main(String[] args) { int[] arr = { 21, 32, 122, 433, 2322222, 56, 121, 565, 123 }; sort(arr, 0, arr.length - 1); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ","); } } }
如评论中所述,改进后的代码如下:
------在36行和42行中加入了=号-------
1 package Alrithm; 2 3 /** 4 * 快速排序 5 * 6 * @author tab 7 */ 8 public class QuickSort { 9 public static void main(String[] args) { 10 QuickSort qs = new QuickSort(); 11 int[] arr = { 12, 232, 12, 12, 221212132, 12, 12, 233332, 12, 14442, 23552, 1244, 12, 33232, 1222, 12, 455232, 12 432212, 14465422, 232, 12, 12, 232, 12 }; 13 qs.quickSort(0, arr.length - 1, arr); 14 for (int i = 0; i < arr.length; i++) { 15 System.out.print(arr[i] + ","); 16 } 17 } 18 19 /** 20 * 21 * @param arr 22 * 要排序的数组 23 */ 24 public void quickSort(int low, int high, int[] arr) { 25 // 思路: 26 // 2.将最左边的数的指针标记为low,将最右边的数的值栈标记为high 27 int i = low; 28 int j = high; 29 // 3.先从基数的另一边的开始和基数比较,如果该数比基数小,则角标i的表示的数和角标high表示的数交换位置,并停止,又从左边开始和基数比较 30 // <1>首先,必须是low角标小于high角标才进行比较 31 // <2>其次,在low角标和high角标相等时就停止第一轮比较 32 if (low < high) {// 一轮比较开始 33 // 1.选择一个基数,通常为左边或者右边的数 34 int base = arr[low];// 要放在if内部,因为可能出现low大于high的情况 35 while (i < j) {// 在i角标小于j角标时进行循环 36 while (base <= arr[j] && i < j) {// 循环比较右边的数(base与arr[j]比较时还要考虑相等的情况) 37 j--;// 如果大于基数就角标减1继续比较前一个数 38 } 39 // 在上面的循环结束即找到右边的数比左边小时,替换i和j角标对应的数,即时没找到,此时i和j相等,互换值也没问题 40 swap(i, j, arr); 41 // 同上,进行左边的数与基数的比较,小于基数则向前i++,否则互换i和j的数值,并重新开始从右边进行循环比较 42 while (base >= arr[i] && i < j) { 43 i++; 44 } 45 swap(i, j, arr); 46 } 47 // 当一轮执行完了以后使用递归,进行下一轮的比较 48 quickSort(low, i - 1, arr); 49 quickSort(i + 1, high, arr); 50 } 51 } 52 53 public void swap(int i, int j, int[] arr) { 54 int temp = arr[i]; 55 arr[i] = arr[j]; 56 arr[j] = temp; 57 } 58 }