1.插入排序
算法思想:
类似对扑克手牌进行排序的思想。
首先认为第1个元素是有序的,对后面n-1个元素进行遍历。让第i个元素对于整个序列从后往前遍历,即从i-1开始比较,如果i<j,则将j元素位置后移一位,否则插入到j元素的后面一个位置。
代码实现
package main
import "fmt"
func main() {
a := [6]int{4, 2, 3, 8, 6, 10}
for i := 1; i < len(a); i++ {
tmp := a[i]
end := i - 1
for end >= 0 {
if a[end] > tmp {
a[i] = a[end]
end--
} else {
break
}
}
end++
a[end] = tmp
}
for _, v := range a {
fmt.Println(v)
}
}
复杂度分析
时间复杂度:
最坏:O(n^2)。接近于逆序表
最好:O(n)。接近于顺序表
2.希尔排序
算法思想:
对插入排序的优化。
通过不断缩减gap,对数组进行分组,分别对每一组进行插入排序,使得数组接近有序,从而减低插入排序的次数。
当gap=1时变为普通的插入排序。
代码实现
package main
import "fmt"
func ShellSort() {
a := [5]int{4, 2, 3, 8, 6}
gap := len(a)
for gap > 1 {
gap = (gap / 3) + 1
for i := 0; i < len(a)-gap; i++ {
end := i
tmp := a[end+gap]
for end >= 0 {
if a[end] > tmp {
a[end+gap] = a[end]
end -= gap
} else {
break
}
}
a[end+gap] = tmp
}
}
for _, v := range a {
fmt.Println(v)
}
}
复杂度分析
时间复杂度:
O(NLog2N)