1. 程式人生 > 實用技巧 >215 陣列中的第K個最大元素

215 陣列中的第K個最大元素

快速排序的思想:

利用 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;
    }
}