215 陣列中的第K個最大元素
阿新 • • 發佈:2020-08-20
快速排序的思想:
利用 patition 函式,選出一個 pivot,將比 pivot 大的元素放在pivot的右邊,把 pivot 小的元素放在 pivot 的左邊,這樣 pivot 的最終位置就確定了。
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] nums = new int[]{6,-2,4,10,5}; quickSort(nums, 0, nums.length - 1); System.out.println(Arrays.toString(nums)); } public static void quickSort(int[] nums, int l, int r){ if(l < r){ //index陣列中某數字的下標 int index = patition(nums, l, r); //左右子陣列遞迴排序 quickSort(nums, l, index - 1); quickSort(nums, index + 1, r); } } public static int patition(int[] nums, int l, int r){ //每次選中的 pivot 是最右邊的元素 int pivot = nums[r]; int i = l - 1;// for(int j = l; j < r; j++){ if(nums[j] < pivot){ i ++; swap(nums, i, j); } } swap(nums, i + 1, r);//把基準放在它最終的位置 return i + 1; } public static void swap(int[] nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } /* [-2, 4, 5, 6, 10] */
程式碼
import java.util.*; /* 利用快速排序的patition函式,確定第 k 大的元素的位置即可 */ class Solution { Random random = new Random(); public int findKthLargest(int[] nums, int k) { return quickSelect(nums, 0, nums.length - 1, nums.length - k); } /* 快速選擇 */ public int quickSelect(int[] a, int l, int r, int index){ int q = randomPatition(a, l, r); if(q == index){ return a[q]; } else{ return q < index ? quickSelect(a, q + 1, r, index) : quickSelect(a, l, q - 1, index); } } /* 隨機分 */ public int randomPatition(int[] a, int l, int r){ int i = random.nextInt(r - l + 1) + l; swap(a, i, r); return patition(a, l, r); } /* 將陣列分成兩半,返回中間數的位置 */ public int patition(int[] a, int l, int r){ int x = a[r], i = l - 1; for(int j = l; j < r; j++){ if(a[j] <= x){ swap(a, ++i, j); } } swap(a, i + 1, r); return i + 1; } /* 交換兩數 */ public void swap(int[] a, int i, int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } }