快速排序
描述思想:选一基准元素,依次将剩余元素中小于该基准元素的值放置其左侧,大于等于该基准元素的值放置其右侧;然后,取基准元素的前半部分和后半部分分别进行同样的处理;以此类推,直至各子序列剩余一个元素时,即排序完成。
1 /** 2 * 快速排序 3 * 思路:选取基准元素tmp = arr[start],先后从往前遍历,如果tmp < arr(end),则end--, 4 * 直到tmp >= arr(end),此时让arr[start]=arr[end] 5 * 然后从左往右遍历,如果tmp > arr[start],start++, 6 * 直到tmp <= arr[start],此时让arr[end]=arr[start] 7 * 8 * 这样遍历一次之后,tmp所在的位置就是中间位置,同理,遍历tmp左边和右边的子数组。 9 * 最终循环结束,就是有序的数组 10 * @param arr - 数组 11 * @param start - 起始位置 12 * @param end - 结束位置 13 */ 14 public static void quickSort(int [] arr, int start, int end) { 15 //数组arr空or仅有一个元素则退出 16 if (start >= end - 1) 17 return; 18 19 if (start < end) { 20 //寻找基准元素的位置 21 int index = getIndex(arr, start, end); 22 23 //遍历index位置左边和右边的子数组。 24 quickSort(arr, 0, index - 1); 25 quickSort(arr, index + 1, end); 26 } 27 } 28 public static int getIndex(int [] arr, int start, int end) { 29 30 //选取基准数据 31 int tmp = arr[start]; 32 33 while (start < end) { 34 //开始从右往左遍历,当队尾元素大于等于tmp时,向前挪动指针 35 while (start < end && tmp <= arr[end]) { 36 end--; 37 } 38 //执行到这里说明tmp大于arr[end]了,让end位置的值赋值给start位置的值 39 arr[start] = arr[end]; 40 41 //开始从左往右遍历,当队首元素小于等于tmp时,向后挪动指针 42 while (start < end && tmp >= arr[start]) { 43 start++; 44 } 45 arr[end] = arr[start]; 46 } 47 48 //执行到这里,start和end肯定相等,也就是tmp的位置,需要将tmp赋值给arr[start] 49 arr[start] = tmp; 50 return start; 51 } 52 53 public static void main(String[] args) { 54 int [] arrs = {8,12,6,13,4,23}; 55 quickSort(arrs, 0, arrs.length - 1); 56 System.out.println("=====排序之后======"); 57 for(int e : arrs) { 58 System.out.print(e + " "); 59 } 60 }