使用插入排序按升序对数组进行排序的 Golang 程序

go programmingserver side programmingprogramming更新于 2025/5/10 15:37:17

插入排序被定义为一种就地算法,并且被声明为一种稳定算法。通过交换元素按升序或降序对数组进行排序的想法可用于实现插入排序。例如,如果数组在列表中仅包含一个项目,则认为它已排序。否则,我们认为元素列表中的某一部分已排序,而其他部分未排序。基于此假设,我们遍历未排序列表,一次挑选一个元素。

语法

rand.Seed(value)

Rand.Seed() 函数用于生成随机数。它将用户输入作为参数,这是生成随机数的上限。

func Now() Time

Now()函数定义在time包中。该函数生成当前本地时间。要使用这个函数,我们必须首先在程序中导入time包。

func (t Time) UnixNano() int64

UnixNano()函数定义在time包中。该函数用于获取从1970年1月1日开始经过的秒数(UTC)。它返回的最终结果是64位的整数类型。

rand.Intn(n)

Intn()函数定义在math/rand包中。它用于在[0, n]区间内生成一个随机数。其中 n 是用户提供的数字。如果提供的数字小于 0,则该函数会抛出错误。

算法步骤

步骤 1 - 如果它是第一个元素,则列表中的元素已经排序。

步骤 2 - 如果步骤 1 为假,即列表未排序,则选择下一个元素,称为键

步骤 3 - 将步骤 2 的键值与排序子列表中的所有元素进行比较

步骤 4 - 在排序子列表中移动大于键值的元素

步骤 5 - 将键值插入排序列表中的适当位置

步骤 6 - 重复每个步骤,直到列表排序完成

示例

使用插入排序按升序对整数数组进行排序。

package main
import "fmt"
func main() {
    arr := [6]int{5, 7, 3, 4, 1, 2}
    var flag int = 0
    var item int = 0
    
    // 打印数组
    fmt.Println("用户输入的数组是:\n", arr)
    
    //插入排序按升序排列元素
    for i := 0; i < 6; i++ {
      item = arr[i]
      flag = 0
      for j := i - 1; j >= 0 && flag != 1; j-- {
         if item < arr[j] {
            arr[j+1] = arr[j]
            j = j - 1
            arr[j+1] = item
         } else {
            flag = 1
         }
      }
    }
    // 打印新行
    fmt.Println()
    
    // 打印结果
    fmt.Println("排序后的数组为:\n", arr)
}

输出

用户输入的数组为:
[5 7 3 4 1 2]
排序后的数组为:
[2 4 2 5 2 7]

问题解决方案

在上面的程序中,我们将从用户那里读取一个元素数组,然后使用插入排序按升序对数组进行排序,然后在输出屏幕上打印排序后的数组。

解释

在上面的例子中,我们声明了 main 包。这个 main 包用于指示编译器该包将编译然后生成可执行文件。

我们还导入了 fmt 包。fmt 代表 Format Package。这个包用于格式化基本字符串和值。包含 fmt 包将达到目的,这使我们能够使用与 fmt 相关的函数。

示例

使用插入排序和随机值按升序对整数数组进行排序。

package main
import (
    "fmt"
    "math/rand" // math/rand 包提供伪随机数生成
    "time" // time 包提供测量和显示时间的功能
)
func main() {
    
    // 调用 generateSlice() 函数
    slice := generateSlice(20)
    fmt.Println("未排序的数字是:\n",slice)
    insertsort(slice)
    fmt.Println("已排序的数字是:\n",slice, "\n")
}

// 生成一个大小为 size 的切片,其中填充了随机数
func generateSlice(size int) []int {
    slice := make([]int,size,size)
    
    // 从 1970 年 1 月 1 日到当前时间的秒数生成一个随机数。
    rand.Seed(time.Now().UnixNano())
    for i := 0; i < size; i++ {
        slice[i] = rand.Intn(100) - rand.Intn(100)
    }
    return slice
}
func insertionsort(items []int) {
   var n = len(items)
   for i := 1; i < n; i++ {
      j := i
      for j > 0 {
         if items[j-1] > items[j] {
            items[j-1], items[j] = items[j], items[j-1]
         }
         j = j - 1
      }
   }
}

输出

未排序的数字是
[-28 -35 -26 -3 4 27 14 -30 26 50 -32 2 68 15 -7 10 -1 60 7 -62]
已排序的数字是
[-62 -35 -32 -30 -28 -26 -7 -3 -1 2 4 7 10 14 15 26 27 50 60 68]

解释

在上面的程序中,我们已经使用了rand.Seed()来生成随机数,它用于设置一个种子值来生成伪随机数。我们需要通过实现插入排序将它们按升序排列。上面程序中的Slice用作灵活且可扩展的数据结构来实现和管理数据集合。

结论

在上面的教程中,我们通过两个不同的示例了解了如何使用插入排序按升序对数组进行排序,其中第一个示例中一个数组完全为正数,而第二个数组中包含负数元素。


相关文章