• 基本排序算法Golang


    摘要

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

    冒泡排序

     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,基数的选择直接影响到效率,同时排序末尾显然有效率问题,可以用其他算法替换。

  • 相关阅读:
    桌面图标背景透明
    如何做好一个中小型企业计算机网络管理员
    打开IE8总是提示欢迎使用?怎样使它不提示?
    js 操作select和option,添加select列
    bios 被加密,怎么进入bios
    Foxmail自动收取新邮件
    代码片段
    提高生活幸福感的13个方法
    水晶报表的真实体验
    游标替代
  • 原文地址:https://www.cnblogs.com/borey/p/5626195.html
Copyright © 2020-2023  润新知