排序算法(三) 快速排序
快速排序:较之前面俩稍微麻烦一些,选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。接着分别比较左右两边的序列,重复上述的循环。
1 public class Kuaisupaixu { 2 /* 3 * public static void sort(int[] a, int begin, int end) { int i, j, index; 4 * if (begin >= end) // 可行性检查 return; i = begin; j = end; index = a[i]; 5 * 6 * while (i < j) { while (i < j && a[j] >= index) { j--; } if (i < j) { 7 * a[i++] = a[j]; } while (i < j && a[i] < index) { i++; } if (i < j) { 8 * a[j--] = a[i]; } } a[i] = index; sort(a, begin, i - 1); sort(a, i + 1, 9 * end); } 10 * 11 * public static void quickSort(int[] a) { sort(a, 0, a.length - 1); } 12 * 13 * public static void main(String[] args) { int[] a = { 15, 2, 34, 10, 88, 14 * 71 }; quickSort(a); for (int i = 0; i < a.length; i++) { 15 * System.out.print(a[i] + " "); } } 16 */ 17 public static void Ksort(int[] a, int begin, int end) { 18 int i, j, index; 19 if (begin > end) { // 可行性判断 20 return; 21 } else { 22 i = begin; 23 j = end; 24 index = a[i]; 25 } 26 27 while (i < j) { 28 while (i < j && a[j] >= index) { // 从后往前,要是比index大,那就往前面看 29 j--; 30 } 31 if (i < j) { // 当a[j]<index的时候,,就将a[j]的值给a[i],然后i自增后变成i+1 32 a[i++] = a[j]; 33 } 34 while (i < j && a[i] < index) { // 从前往后看,要是比index小,那就继续往后看 35 i++; 36 } 37 if (i < j) { // 当a[i]比index大时候,就将a[i]赋值给a[j],然后j-- 38 a[j--] = a[i]; 39 } 40 } 41 a[i] = index; // 别忘了把index赋值给中间那个人 42 Ksort(a, begin, i - 1); // 开始递归咯 43 Ksort(a, i + 1, end);// 开始递归咯 44 } 45 46 public static void Print(int[] a) { 47 Ksort(a, 0, a.length - 1); 48 } 49 50 public static void main(String[] args) { 51 int[] a = { 2, 15, 11, 54, 23 }; 52 Print(a); 53 for (int i = 0; i < a.length; i++) { 54 System.out.print(a[i] + " "); 55 } 56 57 } 58 }

浙公网安备 33010602011771号