這個演算法寫了我好久,在這裡記一下。
演算法的原理是利用中位數來作為劃分元素選擇第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 組 將不足五個的那組忽略 然後用任意一種排序演算法 因為只對五個數進行排序,所以任取一種排序法就可以了,這裡我選用氣泡...