Golang排序算法学习|青训营笔记

152 阅读3分钟

Golang排序算法学习笔记

引言: 排序算法是计算机科学中的重要主题之一,它能够帮助我们按照特定的顺序重新排列数据。本篇学习笔记将介绍Golang中的基本排序算法,并详细介绍如何实现一种高效的排序算法——pdqsort。

基本排序算法

Golang标准库中已经提供了多种基本排序算法的实现,包括插入排序、冒泡排序和选择排序等。这些算法适用于小型数据集,但对于大型数据集可能效率较低。下面是这些基本排序算法的简要介绍:

  • 插入排序(Insertion Sort):通过构建有序序列,逐个将未排序元素插入到已排序部分的适当位置。
  • 冒泡排序(Bubble Sort):通过重复遍历待排序列表,比较相邻的元素并交换顺序,将较大(或较小)的元素逐渐移至末尾。
  • 选择排序(Selection Sort):通过在未排序部分中选择最小(或最大)的元素并将其放置在已排序部分的末尾,逐渐构建有序序列。

pdqsort算法

pdqsort(Parallel Deterministic Quick Sort)是一种高效的排序算法,它结合了快速排序和插入排序的思想,能够在大多数情况下实现快速排序的高性能,同时对于小型数据集也能有较好的表现。

pdqsort的实现思路如下:

  • 1.对于小型子数组,使用插入排序算法。这是因为插入排序在小型数据集上效率高于快速排序。
  • 2.对于大型数组,使用快速排序算法,其中选择合适的枢纽元素(pivot)进行分区。枢纽元素的选择对快速排序的性能至关重要。
  • 3.为了提高性能,pdqsort还使用了一种双枢纽分区的方法。它选择数组的两个元素作为枢纽元素,并确保左枢纽元素小于等于右枢纽元素。
  • 4.pdqsort还具有递归和非递归两种实现方式,递归实现简单易懂,非递归实现则减少了函数调用的开销。

pdqsort的实现

以下是使用Golang实现pdqsort算法的示例代码:

goCopy code
package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func pdqSort(data sort.Interface, lo, hi int) {
	if hi-lo <= 12 {
		insertionSort(data, lo, hi)
		return
	}

pivot1, pivot2 := choosePivots(data, lo, hi) 
if data.Less(pivot2, pivot1) { 
    data.Swap(pivot1, pivot2) 
}


lt, gt := lo, hi
i := lo + 1
for i <= gt {
	if data.Less(i, pivot1) {
		data.Swap(lt, i)
		lt++
		i++
	} else if data.Less(pivot2, i) {
		data.Swap(i, gt)
		gt--
	} else {
		i++
	}
}

pdqSort(data, lo, lt-1)

if data.Less(lt, gt) {
	pdqSort(data, lt+1, gt-1)
}

pdqSort(data, gt+1, hi)

func insertionSort(data sort.Interface, lo, hi int) { 
    for i := lo + 1; i <= hi; i++ { 
        for j := i; j > lo && data.Less(j, j-1); j-- { 
            data.Swap(j, j-1) 
        } 
    }
 }

func choosePivots(data sort.Interface, lo, hi int) (int, int) { 
    mid := lo + (hi-lo)/2 
    if data.Less(mid, lo) { 
        data.Swap(mid, lo) 
    } 
    if data.Less(hi, lo) { 
        data.Swap(hi, lo) 
    } 
    if data.Less(mid, hi) { 
        data.Swap(mid, hi) 
    }

    pivot1 := lo
    pivot2 := hi
    return pivot1, pivot2

}

func main() { 
    // 创建一个随机的整数切片 
    data := make([]int, 10) for i := range data { 
        data[i] = rand.Intn(100) 
    } 
    fmt.Println("Before sorting:", data)
    // 使用pdqSort排序
    pdqSort(sort.IntSlice(data), 0, len(data)-1)
    fmt.Println("After sorting:", data)
}

在上述代码中,pdqSort 函数是pdqsort算法的主要实现。它首先检查数组大小是否小于等于12,如果是,则使用插入排序。否则,选择枢纽元素,并使用双枢纽分区方法将数组分为小于枢纽元素、等于枢纽元素和大于枢纽元素的三个部分。然后递归地对小于和大于部分进行排序。 最后,通过调用 pdqSort(sort.IntSlice(data), 0, len(data)-1) 来对数据进行排序,并输出结果。

结论:

通过学习Golang中的排序算法,我们了解了基本排序算法如插入排序、冒泡排序和选择排序的原理和使用方法。并且,我们还详细介绍了pdqsort算法的实现思路和Golang代码示例。pdqsort算法结合了快速排序和插入排序的优点,能够在大多数情况下实现高效的排序。掌握这些排序算法对于编写高效的Golang程序至关重要。