快速排序找數組中的第N大數

方法原理:
若是要找數組中第N大元素

使用快排每完成一輪排序,判斷基準數的索引 和 數組長度-N 的關係

索引 = 數組長度-N : 此基準數就是要找的第N大元素
索引 > 數組長度-N : 要找的元素在左邊
索引 < 數組長度-N : 要找的元素在右邊

import java.util.Random;
import java.util.Scanner;

public class quickSortSearch {
     static int[] arr = new int[8];
    static int N ;
    public static void main(String[] args) {

        for (int i = 0; i < arr.length; i++) {
            arr[i]=new Random().nextInt(20)+1;
            System.out.print(arr[i]+" ");
        }
        System.out.println();


        System.out.println("請輸入查詢第幾大數:");
        N = new Scanner(System.in).nextInt();

        quickSort(0,arr.length-1);
    }

    public static  void  quickSort(  int left , int right){

        int i=left,j=right;

        if(left>right)
            return;

        int standard= arr[left];
        // 兩個眼睛不能碰面
        while(i!=j) {
            while (i < j && arr[j] >= standard)
                j--;
            while (i < j && arr[i] <= standard)
                i++;

            if (i != j) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
            }

        }

        //最終將基準數歸位
        arr[left]=arr[i];
        arr[i]=standard;

        if(i==arr.length-N){
            System.out.println(arr[i]);
            return;
        }
        else if(i>arr.length-N){  //在左邊
            quickSort(left,i-1);

        }
        else
            quickSort(i+1,right);

        return ;

    }
}

方法不適用於**數組中含有重複元素
就是有一個數組去重的問題
數組轉Set集合再轉到數組 沒搞明白

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章