Golang 程序实现 Shell 排序


2022年2月4日, Learn eTutorial
1637

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

这里我们将解释如何编写 GO 程序来实现排序算法。有不同类型的排序方法。在本例中,我们使用 Shell 排序来对数组中的元素进行排序。

可以说 Shell 排序是插入排序的扩展版本。两种算法都是基于比较的原地排序算法。Shell 排序是一种适用于中等规模数据集的有效排序算法。

Shell 排序的大部分基于插入排序。在插入排序中,当一个元素需要移动很远时,我们只将元素向前移动一个位置,这涉及到很多次移动才能将元素移动到很远的位置。这会增加算法的执行时间。但在 Shell 排序的情况下,它可以克服插入排序的这个缺点。因为 Shell 排序允许交换相距较远的项。这意味着它避免了像插入排序那样的大量位移。

如何实现 Shell 排序

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

如我们所见,Shell 排序算法首先对相距较远的元素进行排序,然后逐渐缩小它们之间的间距。这个间距称为间隔。这个间隔可以使用下面给出的 Knuth 公式计算:

Knuth 公式
h = h * 3 + 1
其中 "h" 是一个初始值为 1 的间隔

在这个程序中,变量 A 存储数组元素。另一个变量 n 用作数组的大小。使用 for 循环 读取数组元素。通过调用函数 shellSort(A, n) 执行 Shell 排序。这里,函数 shellSort(A, n) 执行以下操作,例如初始化间隔的值,将数组划分为相等间隔的较小子数组,使用插入排序对这些子数组进行排序,并重复此过程直到整个数组排序完成。

下面是 Go 程序中用于实现 Shell 排序的步骤。

算法

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

实现 shellSort(A, n) 的步骤

步骤 1:打开第一个循环执行 Shell 排序,并将索引为 0 的元素与索引为 n/2 的元素进行比较。这里 n/2 索引存储在变量 interval 中。
步骤 2:如果循环条件:索引为 0 的元素大于间隔处的元素为真,则执行步骤 3,否则转到步骤 8。
步骤 3:使用 for 循环打开外部循环进行插入排序,其中循环变量 j 赋值为 j=interval
步骤 4:如果外部循环满足条件 j,那么它将帮助你从左到右遍历数组间隔元素,直到数组末尾。否则,转到步骤 7。
步骤 5:如果内部循环满足排序条件:k >= interval && A[k-interval] > A[k],则交换元素的值。否则,递增 j=j+1 并转到步骤 4。
步骤 6:通过递减 k 的值 k=k-interval 重复步骤 5。
步骤 7:设置 interval = interval /2 并转到步骤 2
步骤 8:返回已排序的数组 A

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(shellSort(A, n))

}

func shellSort(A []int, n int) []int {

    for interval := int(n/2); intervel > 0; interval /= 2 {
     for j := interval; j < n; j++ {
      for k := j; k >= interval && A[k-intervel] > A[k]; k -= interval {
       A[k], A[k-interval] = A[k-interval], A[k]
      }
     }
    }
return A
    
}

                                      

输出

Enter the size of the array
5
Enter elements of the array : 
32
24
56
85
13
Sorted array:
[13 24 32 56 85]