基本排序算法Golang

borey · · 2175 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

摘要

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

冒泡排序

 1 func BubbleSort(vector []int) {  2 fmt.Println("BubbleSort")  3  fmt.Println(vector)  4 for i := 0; i < len(vector); i++ {  5 tag := true // 为了剪枝  6 // 每一趟将最大的数冒泡  7 for j := 0; j < len(vector)-i-1; j++ {  8 if vector[j] > vector[j+1] { /*vector[j] < vector[j+1]*/  9 temp := vector[j] 10 vector[j] = vector[j+1] 11 vector[j+1] = temp 12 tag = false 13  } 14  } 15 if tag { 16 break //0~len(vector)-i没有发生交换说明已经有序 17  } 18  fmt.Println(vector) 19  } 20 }

插入排序

 1 func InsertSort(vector []int) {  2 fmt.Println("InsertSort")  3  fmt.Println(vector)  4 for i := 1; i < len(vector); i++ {  5 // 每一趟不满足条件就选择i为哨兵保存,将哨兵插入0~i-1有序序列(0~i-1始终是有序的)  6 if vector[i] < vector[i-1] { /*vector[i] > vector[i-1]*/  7 temp := vector[i]  8 //后移直到找到哨兵合适的位置  9 j := i - 1 10 for ; j >= 0 && vector[j] > temp; j-- { /*vector[j] < temp*/ 11 vector[j+1] = vector[j] 12  } 13 //插入位置前后都是有序的,最后也是有序的 14 vector[j+1] = temp 15  } 16  fmt.Println(vector) 17  } 18 }

选择排序

 1 func SelectSort(vector []int) {  2 fmt.Println("SelectSort")  3  fmt.Println(vector)  4 for i := 0; i < len(vector); i++ {  5 // 选择最小的元素  6 k := i  7 for j := i + 1; j < len(vector); j++ {  8 if vector[k] > vector[j] {  9 k = j 10  } 11  } 12 // 交换 13 if k != i { 14 temp := vector[i] 15 vector[i] = vector[k] 16 vector[k] = temp 17  } 18  fmt.Println(vector) 19  } 20 }

二元选择排序

 1 func BinarySelectSort(vector []int) {  2 fmt.Println("SelectSort")  3  fmt.Println(vector)  4 n := len(vector)  5 for i := 0; i < n/2; i++ {  6 // 选择最小的元素和最大元素  7 k := i  8 t := n - i - 1  9 for j := i + 1; j <= n-i-1; j++ { 10 if vector[k] > vector[j] { 11 k = j 12  } 13 if vector[t] < vector[j] { 14 t = j 15  } 16  } 17 // 交换 18 if k != i { 19 temp := vector[i] 20 vector[i] = vector[k] 21 vector[k] = temp 22  } 23 if t != n-i-1 { 24 temp := vector[n-i-1] 25 vector[n-i-1] = vector[t] 26 vector[t] = temp 27  } 28  fmt.Println(vector) 29  } 30 }

快速排序

简单的说快速排序就是挖坑填数然后分治,公认效率最好,这个必须会

 1 func QuickSort(vector []int, low, hight int) {  2  fmt.Println(vector)  3 if low < hight {  4 i := low  5 j := hight  6 temp := vector[low] // 开始挖坑填数  7 for i < j {  8 for i < j && vector[j] >= temp {  9 j-- 10  } 11 vector[i] = vector[j] 12 for i < j && vector[i] <= temp { 13 i++ 14  } 15 vector[j] = vector[i] 16  } 17 vector[i] = temp 18 QuickSort(vector, low, i-1) // 分治 19 QuickSort(vector, i+1, hight) 20  } 21 }

常见问题,已知序列WAUSTHKO,将第一个数作W为基数,问:

1,第一趟后的序列是多少?假设递归同时进行

1),OAUSTHKW

2),KAHOTSUW

3),HAKOSTUW

4),AHKOSTUW

2,排序过程中那些数会被作为选基数?

以上标记的都是:W,O,K、T,H

3,基数的选择直接影响到效率,同时排序末尾显然有效率问题,可以用其他算法替换。


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:borey

查看原文:基本排序算法Golang

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2175 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传