Golang 程序实现归并排序


2022 年 2 月 27 日, Learn eTutorial
2053

为了更好地理解这个示例,我们始终建议您学习下面列出的 Golang 编程 的基础主题

数据排序有多种实现方式。当我们比较每种排序算法的效率和速度时,有些算法比其他算法或多或少更高效、更快。在比较排序任务时,我们可以说没有一种最佳的通用解决方案能够完美地适用于所有情况。这意味着每种算法都有其自身的重要性。在本节中,我们将重点关注归并排序算法。

归并排序是一种经典的排序算法,它基于分治策略工作,这意味着我们将问题分解成更小的部分,这将有助于你更容易地解决它。
归并排序的基本思想是将输入数组分成两个子数组。通过递归过程解决每个单独的子数组,然后最后将两个已排序的数组合并为一个最终的已排序数组。我们可以说归并排序比冒泡排序快得多。请注意,归并排序在所有 3 种情况(最坏、平均和最好)下的时间复杂度均为 θ(nLogn)。

如何实现归并排序

让我们了解归并排序的实现。

在这个 GO 程序中,我们导入了“fmt”包,以在程序中包含一些标准库。我们使用在 fmt下定义的 fmt.scanln()fmt.println() 方法接受用户输入的值。为了使用这些函数,我们需要导入“fmt”包。之后主函数开始,在主函数内部,我们执行整个程序。

在这个 Go 程序中,我们主要使用两个函数:递归的 mergeSort 函数和 merge 函数。
mergeSort 函数是一个递归函数,它两次调用自身将数组分成大致相等的两部分,然后调用 merge() 将这些子数组重新组合成一个已排序的数组。

算法

第一步:导入 fmt
步骤 2:打开 main() 函数开始程序,GO 程序的执行从 main() 开始。
步骤 3:声明变量 n
步骤 4:读取数组大小 n
步骤 5:定义数组 A[]
步骤 6:使用“for 循环”读取 A[] 数组元素。
步骤 7:通过调用函数 mergeSort(A) 执行归并排序。
步骤 8:使用 for 循环显示已排序的数组。
步骤 9:退出

实现 mergeSort(A,) 的步骤

步骤 1:使用 if 检查未排序数组 A 的长度是否小于 2。如果是,则返回数组 A。
步骤 2:将 mergeSort(A[:len(items)/2]) 的返回值赋值给变量 first
步骤 3:将 mergeSort(A[len(items)/2:]) 的返回值赋值给变量 second
步骤 4:通过调用函数 merge(first, second) 将两个已排序的列表合并回一个单独的已排序列表。
步骤 5:将结果数组返回给 main 函数。

实现 merge(first, second) 的步骤

步骤 1:将 first 和 second 数组分别赋值给 a[]b[] 作为函数参数。
步骤 2:声明一个数组 final 和循环变量 ij
步骤 3:赋值 i=0j=0
步骤 4:迭代次数等于两个数组/切片中较小的长度。
步骤 5:在每次迭代中,我们比较左右两边的元素,即 a[i]b[i],使用循环将较小的元素插入到结果数组 final 中,直到迭代结束。
步骤 6:当迭代结束时,插入所有缺失的元素。例如,当一个子数组包含较小的元素时,另一个子数组中的元素将是我们尚未插入到结果数组 final 中的元素。
步骤 7:返回结果数组 final
 

Golang 源代码

                                          package main
import "fmt"
func main() {
    
        fmt.Println("Enter the size of the array")
 var n int
 fmt.Scan(&n)
 A := make([]int, n, 100)
fmt.Println("Enter elements of the array : ")

 for i := 0; i < n; i++ {
  fmt.Scan(&A[i])
 }

    fmt.Println("Sorted array:")
   fmt.Println(mergeSort(A))

}

func mergeSort(A []int) []int {
    if len(A) < 2 {
        return A
    }
    first := mergeSort(A[:len(A)/2])
    second := mergeSort(A[len(A)/2:])
    return merge(first, second)
}

func merge(a []int, b []int) []int {
    final := []int{}
    i := 0
    j := 0
    for i < len(a) && j < len(b) {
        if a[i] < b[j] {
            final = append(final, a[i])
            i++
        } else {
            final = append(final, b[j])
            j++
        }
    }
    for ; i < len(a); i++ {
        final = append(final, a[i])
    }
    for ; j < len(b); j++ {
        final = append(final, b[j])
    }
    return final
}

                                      

输出

Enter the size of the array
5
Enter elements of the array : 
3
8
2
6
1
Sorted array:
[1 2 3 6 8]