Golang 如何对一段Search进行排序
在开发中常常需要进行排序操作,Golang中提供了多种排序函数供我们使用。下面我们将介绍如何在Golang中对一段Search进行排序。
冒泡排序
冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的序列,一次比较两个元素,如果他们的顺序错误就交换他们的位置。这个过程持续重复,直到没有元素需要交换。
func bubbleSort(arr []int) []int {
n := len(arr)
for i := 0; i < n; i++ {
for j := 0; j < n-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
func insertSort(arr []int) []int {
n := len(arr)
for i := 1; i < n; i++ {
j := i - 1
tmp := arr[i]
for j >= 0 && arr[j] > tmp {
arr[j+1] = arr[j]
j--
}
arr[j+1] = tmp
}
return arr
}
快速排序
快速排序是运用分治思想对冒泡排序改进的一种排序算法。它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变为有序序列。
func quickSort(arr []int, start, end int) {
if start >= end {
return
}
pivot := arr[end] // 取最末尾元素作为基准值
i, j := start, end
for i < j {
for arr[i] < pivot && i < j {
i++
}
for arr[j] >= pivot && i < j {
j--
}
arr[i], arr[j] = arr[j], arr[i]
}
arr[end], arr[i] = arr[i], arr[end] // 把基准放到合适的位置
quickSort(arr, start, i-1) // 排序左边
quickSort(arr, i+1, end) // 排序右边
}
归并排序
归并排序是将两个已经排序的序列合并成一个序列的操作,它也是一种分治算法,其思想是将待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
func mergeSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
mid := len(arr) / 2
left := mergeSort(arr[:mid])
right := mergeSort(arr[mid:])
return merge(left, right)
}
func merge(left, right []int) []int {
i, j := 0, 0
res := []int{}
for i < len(left) && j < len(right) {
if left[i] < right[j] {
res = append(res, left[i])
i++
} else {
res = append(res, right[j])
j++
}
}
res = append(res, left[i:]...)
res = append(res, right[j:]...)
return res
}
堆排序
堆排序是一种树形选择排序,它的特点是在排序过程中,每次选取未排序序列中最大(或最小)的元素,并将其与未排序序列的最后一个元素交换位置,然后再次调整堆,使其满足堆的性质,重复以上步骤直到排序完成。
func heapSort(arr []int) {
n := len(arr)
// 构建初始堆
for i := n/2 - 1; i >= 0; i-- {
heapify(arr, i, n)
}
// 交换堆顶元素并调整堆
for i := n - 1; i >= 0; i-- {
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, 0, i)
}
}
func heapify(arr []int, i, n int) {
largest := i // 初始化最大值为当前节点
left, right := 2*i+1, 2*i+2
// 判断左右子节点是否超出边界,并找出最大值
if left < n && arr[left] > arr[largest] {
largest = left
}
if right < n && arr[right] > arr[largest] {
largest = right
}
// 若最大值不为当前节点,则交换并调整子节点
if largest != i {
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, largest, n)
}
}
以上就是常用的五种排序算法,我们可以根据需求选择合适的排序方法来处理Search。以下是一些示例代码:
arr := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
sortedArr := bubbleSort(arr)
fmt.Println(sortedArr) // [1 1 2 3 3 4 5 5 6 9]
arr2 := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
sortedArr2 := insertSort(arr2)
fmt.Println(sortedArr2) // [1 1 2 3 3 4 5 5 6 9]
arr3 := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
quickSort(arr3, 0, len(arr3)-1)
fmt.Println(arr3) // [1 1 2 3 3 4 5 5 6 9]
arr4 := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
sortedArr4 := mergeSort(arr4)
fmt.Println(sortedArr4) // [1 1 2 3 3 4 5 5 6 9]
arr5 := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
heapSort(arr5)
fmt.Println(arr5) // [1 1 2 3 3 4 5 5 6 9]
以上代码分别使用了五种排序方法对一个int类型数组进行了排序,并输出了排序结果。
结论
在Golang中,我们可以使用冒泡排序、插入排序、快速排序、归并排序、堆排序等多种排序算法来对一段Search进行排序。选择合适的排序方法,可以提高程序的效率和可读性。