“排序是计算机的核心内容。事实上,从很多方面看,如果没有排序,计算机就不会变成现实。”《算法之美:指导工作与生活的算法》
算法
|
最坏运行时间
|
平均运行时间
|
是否稳定
|
原址排序
|
插入排序
|
Θ(n^2)
|
Θ(n^2)
|
是
|
是
|
归并排序
|
Θ(nlgn)
|
Θ(nlgn)
|
是
|
否
|
堆排序
|
O(nlgn)
|
----
|
否
|
是
|
快速排序
|
Θ(n^2)
|
Θ(nlgn)
|
否
|
是
|
计数排序
|
Θ(n+k)
|
Θ(n+k)
|
是
|
否
|
基数排序
|
Θ(d(n+k))
|
Θ(d(n+k))
|
是
|
否
|
桶排序
|
Θ(n^2)
|
Θ(n)
|
是
|
否
|
|
|
|
|
|
func insertSort(arr []int){
size := len(arr)
if size == 0 || size == 1{
return
}
for j:=1;j<=size-1;j++{
current := j
for i:=j-1;i>=0;i--{
if arr[current] < arr[i] {
arr[current], arr[i] = arr[i],arr[current]
current = i
}else{
break
}
}
}
}
func mergeSort(arr []int) []int{
size := len(arr)
if size < 2 {
return arr
}
left := mergeSort(arr[0:size/2])
right := mergeSort(arr[size/2:])
leftSize := len(left)
rightSize := len(right)
i := 0
j := 0
var result []int
for i < leftSize && j
func heapify(arr []int,size int , index int){
left := 2 * index
right := 2 * index +1
max := index-1
if size >= left && arr[max] < arr [left-1]{
max = left-1
}
if size >= right && arr[max] < arr[right-1]{
max = right-1
}
if max != index-1 {
arr[max], arr[index-1] = arr[index-1], arr[max]
heapify(arr, size, max+1)
}
}
func heapSort(arr []int){
size := len(arr)
for i:= size/2; i>=1; i--{
heapify(arr,size, i)
}
lenOfArr := size
for i:=size-1; i >=1 ;i--{
arr[i], arr[0] = arr[0], arr[i]
heapify(arr,lenOfArr-1, 1)
lenOfArr--
}
}
func quickSort(a []int) []int{
size := len(a)
if size < 2 {
return a
}
left, right := 0, size-1
for i:=0; i< size-1; i++{
if a[i] < a[right]{
a[left], a[i] = a[i], a[left]
left++
}
}
a[left], a[right] = a[right], a[left]
quickSort(a[:left])
quickSort(a[left+1:])
return a
}
func quickSort(a []int) []int{
size := len(a)
if size < 2 {
return a
}
left, right := 0, size-1
pivot := rand.Int() % size
a[pivot], a[right] = a[right], a[pivot]
for i:=0; i< size-1; i++{
if a[i] < a[right]{
a[left], a[i] = a[i], a[left]
left++
}
}
a[left], a[right] = a[right], a[left]
quickSort(a[:left])
quickSort(a[left+1:])
return a
}
func countSort(arr []int, max int) []int{
size := len(arr)
if size < 2 {
return arr
}
countArr := make([]int, max+1)
result := make([]int, len(arr))
for _, v := range arr{
countArr[v]++
}
for i:=1; i< max+1 ;i ++{
countArr[i] = countArr[i-1]+countArr[i]
}
for i:=size-1;i>=0;i--{
result[countArr[arr[i]]-1] =arr[i]
countArr[arr[i]]--
}
return result
}
func radixSort(arr []int)[]int {
largestNum := findLargestNum(arr)
size := len(arr)
significantDigit := 1
semiSorted := make([]int, size, size)
for largestNum / significantDigit > 0 {
bucket := [10]int{0}
for i := 0; i < size; i++ {
bucket[(arr[i] / significantDigit) % 10]++
}
for i := 1; i < 10; i++ {
bucket[i] += bucket[i - 1]
}
for i := size - 1; i >= 0; i-- {
bucket[(arr[i] / significantDigit) % 10]--
semiSorted[bucket[(arr[i] / significantDigit) % 10]] = arr[i]
}
for i := 0; i < size; i++ {
arr[i] = semiSorted[i]
}
significantDigit *= 10
}
return arr
}
func bucketSort(arr []float64){
buckets := make([][]float64,10)
for _, v := range arr{
bucketIndex := int(v * 10) % 10
buckets[bucketIndex]= append(buckets[bucketIndex], v)
}
for _ , bucket := range buckets{
sort.Float64s(bucket)
}
currentIndex := 0
for _, bucket := range buckets{
for _, v := range bucket{
arr[currentIndex] = v
currentIndex++
}
}
}