Swift-尋找最大K個(gè)數(shù)

題目:N個(gè)無序的數(shù)(可能數(shù)目非常大),選出其中最大的K個(gè)數(shù)。這個(gè)題目有很多解法,最常用的是快速排序,部分排序,堆排序,計(jì)數(shù)排序,僅通過快速排序的改進(jìn)來實(shí)現(xiàn).

快速排序

快速排序平均的復(fù)雜度為O(NlogN),核心代碼如下:
<pre><code>` func quickSort(arr:inout [Int],low:Int,high:Int) {
if low >= high {
return
}
let mid:Int = partition(arr: &arr,low:low,high:high)
quickSort(arr: &arr, low: low, high: mid - 1)
quickSort(arr: &arr, low: mid + 1, high: high)
}

func partition(arr:inout [Int],low:Int,high:Int) -> Int {
    
    let root:Int = arr[high]
    var index:Int = low
    
    for i in low...high {
        if arr[i] > root {
            if i != index {
                swap(&arr[i], &arr[index])
            }
            index += 1
        }
    }
  
    if index != high {
        swap(&arr[high], &arr[index])
    }
    
    return index
}`</code></pre>

部分排序

題目要求只是尋找最大的K個(gè)數(shù),我們將所有的元素都進(jìn)行了排序,其實(shí)只要將最大的K個(gè)數(shù)排好序就好了,沒必要將剩下的N-K個(gè)數(shù)也進(jìn)行排序。

可以復(fù)用快速排序來完成這個(gè)部分排序的功能,在快速排序中,每一輪都需要選定一個(gè)pivot,每一輪排序完成后,比pivot大的數(shù)都排在它前(后)面,而比pivot小的數(shù)都排在它的后(前)面。假設(shè)前面的序列為a,后面的序列為b,a的長(zhǎng)度為n.
當(dāng)n>K時(shí),我們直接輸出a的前K個(gè)元素就好了;
當(dāng)n=K時(shí),我們直接輸出a這個(gè)序列;
當(dāng)n<K時(shí),我們就需要從b中找出K?n個(gè)元素和a一起輸出就好了。
<pre><code>` func kBigNumber(arr:inout [Int],low:Int,high:Int,k:Int)->Int {
var result:Int = -1
if low <= high {
let index = partition(arr: &arr, low: low, high: high)
let num:Int = index - low + 1 // index 之前數(shù)組暫定為a, index 之后的數(shù)組定為b

        if num > k { // 如果a的數(shù)據(jù)大于b的要求,從a 中選擇k個(gè)數(shù)字
            result = kBigNumber(arr: &arr, low: low, high: index - 1, k: k)
        } else if num < k { //如果a的個(gè)數(shù)不夠的話,那么再?gòu)腷中找K-n個(gè)
            result = kBigNumber(arr: &arr, low: index + 1, high: high , k: k - num)
        } else {
            result = index
        }
    }
    return result
}`</code></pre>

測(cè)試代碼:
<pre><code>var kData:[Int] = [1,2,3,4,8,3,2,5,10,100,30] var bigIndex:Int = -1 bigIndex = bigNumber.kBigNumber(arr: &kData, low: 0, high: kData.count - 1, k: 4) if bigIndex >= 0 { for i in 0...bigIndex { print("FlyElephant---最大的k個(gè)數(shù)---\(kData[i])") } print("FlyElephant--部分排序之后的數(shù)據(jù)---\(kData)") }</code></pre>

FlyElephant--png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,220評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評(píng)論 0 15
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,769評(píng)論 0 33
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,282評(píng)論 0 2
  • HoooChan閱讀 226評(píng)論 0 0