目的
提前预防老年痴呆...学习下常用算法
自己的简单理解
1.选取一个基准值
2.经过一轮排序,基准左边的数字都比基准小,基准右边的都比基准大
2.1头指针指向待排序数组的第一个元素,尾指针指向待排序数组最后一个元素,基准有很多种选择方法,最简单的方法是指向待排序数组的第一个元素
2.2如果尾指针指向的数字比基准值大就向前移动否则交换头尾指针指向的数字,然后判断头指针指向的数字是否比基准小,小就向后移动,否则交换头尾指针指向的数字,再继续进行2.2
2.3一轮排序终止条件是头尾指针重合
3.对于基准左边和右边的数字再进行上诉1,2两步排序.
4.只有1个数字的时候就不用排序了.
具体实现
1 package algorithm; 2 3 import java.util.Arrays; 4 5 public class QuickSortTest1 { 6 public static void main(String[] args) { 7 int[] arr1 = { 4, 7, 5, 6, 1, 3, 8 }; 8 int[] arr2 = { 7, 6, 5, 4, 3, 2, 1 }; 9 int[] arr3 = { 5, 9, 3, 7, 8, 6, 1, 2, 4 }; 10 int[] arr4 = { 13, 2, 5, 4, 88, 76, 68, 87, 55, 88, 88, 77, 67, 99, 100, 5, 53, 52, 51, 66 }; 11 sort(arr1); 12 sort(arr2); 13 sort(arr3); 14 sort(arr4); 15 System.out.println(Arrays.toString(arr1)); 16 System.out.println(Arrays.toString(arr2)); 17 System.out.println(Arrays.toString(arr3)); 18 System.out.println(Arrays.toString(arr4)); 19 } 20 21 private static void sort(int[] arr) { 22 sortInternal(arr, 0, arr.length - 1); 23 } 24 25 private static void sortInternal(int[] arr, int low, int high) { 26 // 当然只有1个元素的时候就不需要排序了,这里low>=而不是=是因为下面 27 // sortInternal(arr, currPosition + 1, high); 28 // currPositon+1可能会导致low=hight的时候low+1>high 29 if (low >= high) { // 这个if是递归结束条件 30 return; 31 } else { // 递归分解条件 32 int currPosition = sortOnce(arr, low, high); // 得到一个基准值的最终位置,左边的数字都比它小,右边都比它大 33 sortInternal(arr, low, currPosition - 1); // 左边的数字继续递归进行快速排序 34 sortInternal(arr, currPosition + 1, high);// 右边的数字继续递归进行快速排序 35 } 36 } 37 38 /** 39 * 一轮排序 40 * 41 * @param arr 42 * 待排序数组 43 * @param low 44 * 头指针 45 * @param high 46 * 尾指针 47 * @return 基准的位置 48 */ 49 private static int sortOnce(int[] arr, int low, int high) { 50 int key = arr[low]; // 基准有很多种选择方法,取最左边的元素只是一种方法 51 while (high > low) {// 每一轮终止条件是2个指针重合 52 while (high > low) { // 每一轮开始先移动尾指针 53 if (arr[high] > key) { // high的数字比基准大 54 high--; // high向前移动 55 } else { 56 swap(arr, low, high); // 交换low和high位置的数字 57 low++;// 交换过位置了不用再次判断,所以low++ 58 break;// 准备开始头指针的移动 59 } 60 } 61 while (high > low) {// 头指针和尾指针交换过位置的话再开始移动头指针,再交换的话继续下个外层while循环继续移动头指针 62 if (arr[low] < key) { // low的数字比基准小 63 low++;// low向后移动 64 } else { 65 swap(arr, low, high);// 交换low和high位置的数字 66 high--;// 交换过位置了不用再次判断,所以high-- 67 break;// 准备开始尾指针的移动 68 } 69 } 70 } 71 return low;// high和low重合,返回哪个都一样 72 } 73 74 /** 75 * 交换数字high和low位置的2个数字 76 * 77 * @param arr 78 * @param p1 79 * @param p2 80 */ 81 private static void swap(int[] arr, int p1, int p2) { 82 int temp = arr[p1]; 83 arr[p1] = arr[p2]; 84 arr[p2] = temp; 85 } 86 }