Golang实现基本排序算法
jopen
10年前
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
冒泡排序
func BubbleSort(vector []int) { fmt.Println("BubbleSort") fmt.Println(vector) for i := 0; i < len(vector); i++ { tag := true // 为了剪枝 // 每一趟将最大的数冒泡 for j := 0; j < len(vector)-i-1; j++ { if vector[j] > vector[j+1] { /*vector[j] < vector[j+1]*/ temp := vector[j] vector[j] = vector[j+1] vector[j+1] = temp tag = false } } if tag { break //0~len(vector)-i没有发生交换说明已经有序 } fmt.Println(vector) } }
插入排序
func InsertSort(vector []int) { fmt.Println("InsertSort") fmt.Println(vector) for i := 1; i < len(vector); i++ { // 每一趟不满足条件就选择i为哨兵保存,将哨兵插入0~i-1有序序列(0~i-1始终是有序的) if vector[i] < vector[i-1] { /*vector[i] > vector[i-1]*/ temp := vector[i] //后移直到找到哨兵合适的位置 j := i - 1 for ; j >= 0 && vector[j] > temp; j-- { /*vector[j] < temp*/ vector[j+1] = vector[j] } //插入位置前后都是有序的,最后也是有序的 vector[j+1] = temp } fmt.Println(vector) } }
选择排序
func SelectSort(vector []int) { fmt.Println("SelectSort") fmt.Println(vector) for i := 0; i < len(vector); i++ { // 选择最小的元素 k := i for j := i + 1; j < len(vector); j++ { if vector[k] > vector[j] { k = j } } // 交换 if k != i { temp := vector[i] vector[i] = vector[k] vector[k] = temp } fmt.Println(vector) } }
二元选择排序
func BinarySelectSort(vector []int) { fmt.Println("SelectSort") fmt.Println(vector) n := len(vector) for i := 0; i < n/2; i++ { // 选择最小的元素和最大元素 k := i t := n - i - 1 for j := i + 1; j <= n-i-1; j++ { if vector[k] > vector[j] { k = j } if vector[t] < vector[j] { t = j } } // 交换 if k != i { temp := vector[i] vector[i] = vector[k] vector[k] = temp } if t != n-i-1 { temp := vector[n-i-1] vector[n-i-1] = vector[t] vector[t] = temp } fmt.Println(vector) } }
快速排序
简单的说快速排序就是挖坑填数然后分治,公认效率最好,这个必须会
func QuickSort(vector []int, low, hight int) { fmt.Println(vector) if low < hight { i := low j := hight temp := vector[low] // 开始挖坑填数 for i < j { for i < j && vector[j] >= temp { j-- } vector[i] = vector[j] for i < j && vector[i] <= temp { i++ } vector[j] = vector[i] } vector[i] = temp QuickSort(vector, low, i-1) // 分治 QuickSort(vector, i+1, hight) } }
常见问题,已知序列WAUSTHKO,将第一个数作W为基数,问:
1,第一趟后的序列是多少?假设递归同时进行
1),OAUSTHKW
2),KAHOTSUW
3),HAKOSTUW
4),AHKOSTUW
2,排序过程中那些数会被作为选基数?
以上标记的都是:W,O,K、T,H
3,基数的选择直接影响到效率,同时排序末尾显然有效率问题,可以用其他算法替换。
来自:http://my.oschina.net/xlplbo/blog/343768