最差情況為線性時間的選擇

2021-07-26 12:35:44 字數 2295 閱讀 6160

這個演算法寫了我好久,在這裡記一下。

演算法的原理是利用中位數來作為劃分元素選擇第m小的元素,中位數需要遞迴自身來求得。演算法的最優,平均,最差時間複雜度都為o(n)。相對於隨機演算法改善了最差時間複雜度。

和快排用了同樣的partition,但是這個演算法所使用的pivot是確定的,即中位數。

**版本為golang 1.8.0。

路徑goworkspace/algorithms/worselinearselect.go

package algorithms

import (

"fmt"

)func worselinearselect(array int, startindex, stopindex, rank int)(selectedvalue int)

midvaluearrays := getmidvaluearray(array, startindex, stopindex)

midvalue := worselinearselect(midvaluearrays, 0, len(midvaluearrays), (len(midvaluearrays) - 1)/2)

devideindex := partitionwithpiovt(array, midvalue)

if devideindex == rank else if devideindex > rank else

}//sort array by groups and return the mid value array

func getmidvaluearray(array int, startindex, stopindex int)(midvalues int) else

//j := 0

for i, j := 0, 0; i < len(array); i += 5 else

//(i + 5 <= len(array)) ? (insertionsort(array[i : i + 5])) : (insertionsort(array[i : len(array)]))

j ++

} return midvalues

}func partitionwithpiovt(array int, pivotvalue int)(firstindex int) else if array[secondindex] == pivotvalue

} swap(&array[0], &array[firstindex])

return firstindex

}func insertionsort(array int)

}()for i := 1; i != len(array); i++ else

} }}func swap(a *int, b *int)

func partition(array int, pivotvalue int) int

main包路徑goworkspace/golangtest/test.go,測試**如下:

package main

import (

"fmt"

"algorithms"

"sort"

"time"

"math/rand"

)func main()

rank := rand.intn(arraylen)

fmt.println("array befor select\n", array)

fmt.println("rank", rank)

fmt.println("array length", arraylen)

//run the select function

selectedvalue := algorithms.worselinearselect(array[:], 0, len(array), rank)

sort.ints(array[:])

fmt.println("\nselectedvalue by sort", array[rank])

fmt.println("\nselectedvalue", selectedvalue)

}

後來發現**還有小缺陷,partition方法會影響到切片中不需要重新劃分的部分,但不影響演算法的複雜度,只是多了一點無意義的操作。

**對於所有測試用例都能通過。

最壞情況為線性時間的選擇演算法

輸入 一系列數a 0 a n 1 和乙個整數k 輸出 這列數中第k小的數 同樣的問題在上篇文章中用快速排序模型,我們得到的平均時間複雜度是o n 但是遺憾的是最壞情況會達到o n 2 這篇文章中我們還是使用快速排序的模型,但是改變了劃分的方式,這個演算法會保準得到乙個很好的劃分。將該演算法叫做sel...

最壞情況為線性時間的選擇演算法

題目 在n個元素的無序陣列中選擇第k 1 k n 小元素。當k 1時,相當於找最小值。當k n時,相當於找最大值。當k n 2時,稱中值。要求 線性時間內完成,即o n 演算法解析 通過執行下列步驟,演算法select可以確定乙個有n 1個不同元素的輸入陣列中第i小的元素。如果n 1,則select...

最壞情況線性時間選擇O n

題目 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 具體解題 這裡我們將所有的數 n個 以每5個劃分為一組,共 n 5 組 將不足五個的那組忽略 然後用任意一種排序演算法 因為只對五個數進行排序,所以任取一種排序法就可以了,這裡我選用氣泡...