快排和利用快排思想查找數組第K大的數

問題:利用快排思想查找一個數組中第K大的數。

思路:快排中遞歸調用一個返回第一個數字把數組分成兩部分之后的一個下標,這個下標就表示了這第一個數字在排序后的位置,我們通過將它與K對比,可以每次只選擇選兩部分之一進行遞歸查詢。

此處利用快排的分治思想查找第K大的數的時候沒有去重,
比如
1、2、3、3、5
第2大和第3大的都是3,第4大的才是2.

Java 代碼:
Java
/** * Created with IntelliJ IDEA.

  • User: hqtc

  • Date: 16-3-22

  • Time: 下午9:52

  • To change this template use File | Settings | File Templates.
    */
    public class QuickSort{

    private int getSeparatorIndex(int[] nums, int low, int high) {
    int k = nums[low];
    while (low < high) {
    while (k < nums[high] && low < high) {
    high--;
    }
    if (low < high)
    nums[low++] = nums[high];
    while (k > nums[low] && low < high) {
    low++;
    }
    if (low < high)
    nums[high--] = nums[low];
    }
    nums[low] = k;
    return low;
    }

    public void sort(int num[], int low, int high) {
    if (low < high) {
    int sepIndex = getSeparatorIndex(num, low, high);
    sort(num, low, sepIndex - 1);
    sort(num, sepIndex + 1, high);
    }
    }

    public int findKthMax(int arr[], int k, int left, int right) {
    int sepIndex = getSeparatorIndex(arr, left, right);
    if (k == arr.length - sepIndex) {
    return arr[sepIndex];
    } else {
    if (k > arr.length - sepIndex) {
    return findKthMax(arr, k, left, sepIndex - 1);
    } else {
    return findKthMax(arr, k, sepIndex + 1, right);
    }
    }
    }
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文出處:http://www.cnblogs.com/maybe2030/p/4715035.html引文出處:...
    明教de教主閱讀 9,217評論 0 7
  • 第一章 緒論 什么是數據結構? 數據結構的定義:數據結構是相互之間存在一種或多種特定關系的數據元素的集合。 第二章...
    SeanCheney閱讀 5,807評論 0 19
  • 參加好報寫作群第二期已到尾聲了,回顧兩個月來的點點滴滴,時間怎么過得如此飛快,轉瞬之間兩個月,60天,想想沒干什么...
    綠兔子000閱讀 389評論 10 3
  • 最近接待了幾位玻璃心來訪者,總跟我討論人際關系的問題,各種受傷還聲淚俱下的問我,自己是不是有病,老實說其實你沒什么...
    煜安的窩兒閱讀 995評論 10 17
  • 我希望我們的世界都很簡單 那么 愛一個人,跑個步,吃頓飯 喂一次狗,一個微笑,一個擁抱 都顯得特別有意義 你常說,...
    一言爾閱讀 491評論 0 3