golang快速排序算法

发布时间:2024-11-24 05:13:59

快速排序算法实现及优化

快速排序是一种常用而有效的排序算法,在大数据量下表现出色。它的基本思想是选取一个基准元素,通过不断比较和交换,将序列分割成两个子序列,然后分别对子序列进行递归排序。

1. 实现快速排序

首先,定义一个函数来实现快速排序:

func QuickSort(arr []int) {
    if len(arr) <= 1 {
        return
    }
    pivot := arr[0]
    left, right := 0, len(arr)-1
    for i := 1; i <= right; {
        if arr[i] < pivot {
            arr[left], arr[i] = arr[i], arr[left]
            left++
            i++
        } else {
            arr[right], arr[i] = arr[i], arr[right]
            right--
        }
    }
    QuickSort(arr[:left])
    QuickSort(arr[left+1:])
}

2. 示例

arr := []int{5, 4, 6, 3, 7, 2, 8, 1}
QuickSort(arr)
fmt.Println(arr) // 输出 [1, 2, 3, 4, 5, 6, 7, 8]

3. 算法分析

快速排序的时间复杂度为O(nlogn),最坏情况下为O(n^2)。快速排序是一种原地排序算法,不需要额外的存储空间。由于使用递归,快速排序的空间复杂度为O(logn)。

4. 优化

虽然快速排序在大多数情况下表现良好,但在某些特殊情况下可能退化成O(n^2)的时间复杂度。为了提高性能,可以采用以下优化措施:

5. 示例代码(优化后)

const insertSortThreshold = 10

func QuickSort(arr []int) {
    quickSortOptimized(arr, 0, len(arr)-1)
}

func quickSortOptimized(arr []int, left, right int) {
    if right-left <= insertSortThreshold {
        insertSort(arr, left, right)
        return
    }
    pivot := medianOfThree(arr, left, right)
    i, j := left+1, right-1
    for {
        for arr[i] < pivot {
            i++
        }
        for arr[j] > pivot {
            j--
        }
        if i >= j {
            break
        }
        arr[i], arr[j] = arr[j], arr[i]
        i++
        j--
    }
    arr[left+1], arr[j] = arr[j], arr[left+1]
    arr[left], arr[j-1] = arr[j-1], arr[left]
    quickSortOptimized(arr, left, j-1)
    quickSortOptimized(arr, j+1, right)
}

func insertSort(arr []int, left, right int) {
    for i := left + 1; i <= right; i++ {
        temp := arr[i]
        j := i
        for ; j > left && arr[j-1] > temp; j-- {
            arr[j] = arr[j-1]
        }
        arr[j] = temp
    }
}

func medianOfThree(arr []int, left, right int) int {
    mid := (left + right) / 2
    if arr[left] > arr[mid] {
        arr[left], arr[mid] = arr[mid], arr[left]
    }
    if arr[left] > arr[right] {
        arr[left], arr[right] = arr[right], arr[left]
    }
    if arr[mid] > arr[right] {
        arr[mid], arr[right] = arr[right], arr[mid]
    }
    arr[left], arr[right-1] = arr[right-1], arr[left]
    return arr[right-1]
}

6. 结论

快速排序是一种高效的排序算法,在大多数情况下表现优于其他常见排序算法。通过合适的优化措施,可以进一步提高其性能。

要记住的一点是,虽然快速排序适用于大数据集和一般情况,但对于小规模数组,插入排序可能更好,因为它具有较低的常量因子。

相关推荐