自己写的代码,记录一下。分别记录了两种partition的方法。
public class QuickSort { public static void quickSort(int[] nums, int start, int end) { if(start >= end) { return; } int pivot = partition2(nums, start, end); quickSort(nums, start, pivot - 1); quickSort(nums, pivot + 1, end); } public static int partition(int[] nums, int start, int end) { int pivot = start; for(int i = start + 1; i <= end; i++) { if(nums[i] <= nums[start]) { pivot++; int temp = nums[pivot]; nums[pivot] = nums[i]; nums[i] = temp; } } int temp = nums[pivot]; nums[pivot] = nums[start]; nums[start] = temp; return pivot; } // better partition method public static int partition2(int[] nums, int start, int end) { int pivot = start, i = start + 1, j = end; while(i <= j) { while(i <= end && nums[i] <= nums[pivot]) { i++; } while(nums[j] >nums[pivot]) { j--; } if(i >= j) { break; } int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } i--; int temp = nums[i]; nums[i] = nums[pivot]; nums[pivot] = temp; return i; } public static void main(String[] args) { int[] nums = new int[]{13, 6, 9, 1, 19, -21, 5}; quickSort(nums, 0, nums.length - 1); System.out.println(nums); } }
//20181015
重写了partition2,上面的方法太冗余。
1. i完全可以从start开始,而不是start+1,因为nums[start]在下面也会因为和pivot相等而跳过。这样做可以避免一个错误,就是不会因为下面while的判断i<j,而跳过下面的处理。这样的话,如果数组是{1,2},也会直接从37行开始交换{2,1},这是显然错误的。
2. 这样的思路比较清晰,两个<的地方不用<=,显然是因为如果i和j是同一个元素,就不需要比较了,因为下面的操作是交换。
3.37行是交换j,因为j最后来到的地方必然是最后一个小于等于pivot的地方。这里用i-1也可以,但是j更清晰。
1 class Solution { 2 public int findKthLargest(int[] nums, int k) { 3 return find(nums, k, 0, nums.length - 1); 4 } 5 6 public int find(int[] nums, int k, int start, int end) { 7 int pivot = partition(nums, start, end); 8 if (k == end - pivot + 1) { 9 return nums[pivot]; 10 } else if (k < end - pivot + 1) { 11 return find(nums, k, pivot + 1, end); 12 } else { 13 return find(nums, k - (end- pivot) - 1, start, pivot - 1); 14 } 15 } 16 17 public int partition(int[] nums, int start, int end) { 18 if (start >= end) { 19 return start; 20 } 21 int pivot = nums[start], i = start, j = end; 22 while (i < j) { 23 while (i <= end && nums[i] <= pivot) { 24 i++; 25 } 26 while (nums[j] > pivot) { 27 j--; 28 } 29 if (i > j) { 30 break; 31 } 32 int temp = nums[i]; 33 nums[i] = nums[j]; 34 nums[j] = temp; 35 } 36 // j不可能<start,因为nums[start] == pivot 37 int temp = nums[start]; 38 nums[start] = nums[j]; 39 nums[j] = temp; 40 return j; 41 } 42 }