func BubbleSort(array *[]int) {
if array == nil {
return
}
length := len(*array)
for i := 0; i < length -1; i++ {
flag := false
for j := 0; j < length -1; j++ {
if (*array)[j+1] < (*array)[j] {
(*array)[j], (*array)[j+1] = (*array)[j+1], (*array)[j]
flag = true
}
}
if !flag {
break
}
}
}
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
func SelectSort(array *[]int) {
if array == nil {
return
}
length := len(*array)
for i := 0; i < length-1; i++ {
for j := i + 1; j < length; j++ {
if (*array)[j] <= (*array)[i] {
(*array)[i], (*array)[j] = (*array)[j], (*array)[i]
}
}
}
}
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
func InserSort(array *[]int) {
if array == nil {
return
}
length := len(*array)
for i := 0; i < length; i++ {
for j := i; j > 0; j-- {
if (*array)[j] < (*array)[j -1] {
(*array)[j], (*array)[j -1] = (*array)[j-1], (*array)[j]
}
}
}
}
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
//归并
func merge(array *[]int, left, right int) {
begin1 := left
end1 := (left + right) / 2
begin2 := end1 +1
end2 := right
pTemp := make([]int, right - left +1)
count := 0
//合并有序数组
for begin1 < end1 && begin2 < end2 {
if (*array)[begin1] < (*array)[begin2] {
pTemp[count] = (*array)[begin1]
begin1++
} else {
pTemp[count] = (*array)[begin2]
begin2++
}
count++
}
for begin1 <= end1 {
pTemp[count] = (*array)[begin1]
begin1++
count++
}
for begin2 <= end2 {
pTemp[count] = (*array)[begin2]
begin2++
count++
}
count = 0
for i := left ; i < right - left + 1; i++ {
(*array)[i] = pTemp[count]
count++
}
}
func MergeSort(array *[]int, left, right int ) {
if array == nil {
return
}
mid := (left + right) / 2
if left < right {
//拆分
MergeSort(array, left, mid)
MergeSort(array, mid + 1 , right)
//合并
merge(array, left, right)
}
}
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
func quickSortPartition(array *[]int, left int, right int) int {
temp := (*array)[left]
i := left +1
j := right
for i < j {
for (*array)[j] > temp{
j--
}
for (*array)[i] < temp {
i++
}
if i < j {
(*array)[i], (*array)[j] = (*array)[j], (*array)[i]
continue
}
i++
}
(*array)[j], (*array)[left] = (*array)[left], (*array)[j]
return j
}
func QuickSort(array *[]int, left int, right int) {
length := len(*array)
if length <= 0 || left < 0 || right > length - 1 || left > right{
return
}
partition := quickSortPartition(array, left, right)
QuickSort(array, left, partition -1)
QuickSort(array, partition + 1, right)
}
// 小根堆
//length--需要调整的长度,index--第一个非叶子节点坐标
func adjust(array *[]int, length int, index int) {
indexLeft := 2 *index +1
indexRight := 2 *index +2
maxIndex := index
if indexLeft < length && (*array)[indexLeft] > (*array)[maxIndex] {
maxIndex = indexLeft
}
if indexRight < length && (*array)[indexRight] > (*array)[maxIndex] {
maxIndex = indexRight
}
if maxIndex != index {
(*array)[maxIndex], (*array)[index] = (*array)[index], (*array)[maxIndex]
adjust(array, length, maxIndex)
}
}
func HeapSort(array *[]int) {
if array == nil {
return
}
length := len(*array)
//构建大顶堆
for i := length/2 -1; i >= 0; i-- {
adjust(array, length, i)
}
//调整大顶堆,交换堆尾和堆首
for i := length -1; i > 0; i-- {
(*array)[0], (*array)[i] = (*array)[i], (*array)[0]
//重建大顶堆,将前面无序堆调整成大顶堆
adjust(array, i, 0)
}
}