• 插入排序,归并排序和冒泡排序(怎么以前觉得那么难呢?)


     1 // mergesort project main.go
     2 package main
     3 
     4 import (
     5     "fmt"
     6 )
     7 
     8 func main() {
     9     array := []int{25, 18, 23, 54, 27, 95, 12, 36, 5, 49, 32}
    10     arrays := array[:]
    11     MergeSort(arrays, 0, len(arrays)-1)
    12     display(arrays)
    13 }
    14 
    15 func MergeSort(arrays []int, low, high int) {
    16     if low < high {
    17         mid := (low + high) / 2
    18         MergeSort(arrays, low, mid)
    19         MergeSort(arrays, mid+1, high)
    20         merge(arrays, low, mid+1, high)
    21     }
    22 
    23 }
    24 func merge(arrays []int, low, mid, high int) {
    25     midrec := mid
    26     lowrec := low
    27     array := make([]int, high-low+1)
    28     count := 0
    29     for low < midrec && mid <= high {
    30         if arrays[low] <= arrays[mid] {
    31             array[count] = arrays[low]
    32             low++
    33         } else {
    34             array[count] = arrays[mid]
    35             mid++
    36         }
    37         count++
    38     }
    39     for low < midrec {
    40         array[count] = arrays[low]
    41         low++
    42         count++
    43     }
    44     for mid <= high {
    45         array[count] = arrays[mid]
    46         mid++
    47         count++
    48     }
    49     for i := 0; i < (high - lowrec + 1); i++ {
    50         arrays[lowrec+i] = array[i]
    51     }
    52 }
    53 
    54 func display(arrays []int) {
    55     for i := 0; i < len(arrays); i++ {
    56         fmt.Print(arrays[i], "\t")
    57     }
    58     fmt.Println()
    59 }

    归并排序,跟名字一样,最主要的步骤就是归并。把两个已经有序的序列合并为一个序列。这里原来比较迷惑的就是确定low,mid,high。在合并时候,老是出错,忘记了一个问题,指针是会移动的,如果后面需要用到,要提前将结果保存下来。找了好久的问题,实在是不应该啊。

    插入排序跟平时玩牌时候大家放排的习惯很一样,都是将一个个元素插入到一个有序序列中,通过移动的方式实现。

     1 // insertsort project main.go
     2 package main
     3 
     4 import (
     5     "fmt"
     6 )
     7 
     8 func main() {
     9     array := []int{25, 36, 54, 23, 15, 36, 87, 1, 69, 48, 62, 47}
    10     arrays := array[:]
    11     fmt.Println("before sort:")
    12     display(arrays)
    13     InsertSort(arrays)
    14     fmt.Println("after sort:")
    15     display(arrays)
    16 }
    17 
    18 func InsertSort(arrays []int) {
    19     size := len(arrays)
    20     for i := 1; i < size; i++ {
    21         if arrays[i] < arrays[i-1] {
    22             temp := arrays[i]
    23             var j int
    24             for j = i - 1; j >= 0 && arrays[j] > temp; j-- {
    25                 arrays[j+1] = arrays[j]
    26             }
    27             if j == -1 {
    28                 arrays[0] = temp
    29             } else {
    30                 arrays[j+1] = temp
    31             }
    32         }
    33         display(arrays)
    34     }
    35 }
    36 func display(arrays []int) {
    37     for i := 0; i < len(arrays); i++ {
    38         fmt.Print(arrays[i], "\t")
    39     }
    40     fmt.Println()
    41 }
     1 // bubblesort project main.go
     2 package main
     3 
     4 import (
     5     "fmt"
     6 )
     7 
     8 func main() {
     9     array := []int{25, 18, 23, 54, 27, 95, 12, 36, 5, 49, 32}
    10     arrays := array[:]
    11     BubbleSort(arrays)
    12     display(arrays)
    13 }
    14 func BubbleSort(arrays []int) {
    15     size := len(arrays)
    16     for i := 1; i <= size; i++ {
    17         for j := size - 1; j >= i; j-- {
    18             if arrays[j] < arrays[j-1] {
    19                 swap(&arrays[j], &arrays[j-1])
    20             }
    21         }
    22     }
    23 }
    24 func swap(numa, numb *int) {
    25     temp := *numa
    26     *numa = *numb
    27     *numb = temp
    28 }
    29 
    30 func display(arrays []int) {
    31     for i := 0; i < len(arrays); i++ {
    32         fmt.Print(arrays[i], "\t")
    33     }
    34     fmt.Println()
    35 }

    上面的冒泡算法是可以优化的,我没有写。我一直在找一个正确的冒泡排序写法,所谓正确就是对得起冒泡这个名字,可是现在也没有找到。我理解的冒泡就是较小的气泡向上浮动,所以就从size大的一头开始了。

  • 相关阅读:
    ajax的post提交方式和传统的post提交方式哪个更快?
    请问具体到PHP的代码层面,改善高并发的措施有哪些
    TP为什么这个if判断什么都不显示?
    如何用正则匹配这段文本
    七牛上图片总是net::ERR_NAME_NOT_RESOLVED
    该如何来开发这个喜欢的功能呢?
    打包phar文件过大的问题。
    .map(function(item)...)这个是按hashcode自动遍历的,怎么才能按照我想要的顺序遍历呢?
    Java操作Kafka执行不成功
    webkit事件处理
  • 原文地址:https://www.cnblogs.com/lxy15329/p/sort.html
Copyright © 2020-2023  润新知