美文网首页Golang 学习日志
GO语言实现 一 快速排序(一)

GO语言实现 一 快速排序(一)

作者: YXCoder | 来源:发表于2020-10-08 21:38 被阅读0次

快速排序被誉为20世纪科学和工程领域的十大算法之一。听名字就能了解,快速排序的特点,就是快

快速排序

快速排序采用了二分递归的思想,通过一趟排序将整个数组划分为两个部分,低位部分的值全部小于高位部分的值,然后对低位和高位部分分别排序

快速排序算法的具体步骤如下:

  1. 对数组 arr 进行随机洗牌

  2. 划分数组,我们通过交换操作,找到合适的 j,保证

    • j 左边的元素全部小于 arr[j]
    • j 右边的元素全部大于 arr[j]
  3. 对每一块被划分的切片进行排序

qs1.png

我们可以通过双指针在O(n)的时间复杂度内获取合适的 j

我们设立两个指针 i 和 j,同时设置一个标志值 arr[low],一般来说,标志值取数组第一个元素

  • 当 arr[i] < arr[low]时,指针 i 从左至右一直扫描
  • 当 arr[j] > arr[low]时,指针 j 从右至左一直扫描
  • 交换 arr[i]和 a[j]的元素
  • 当 i < j 时重复以上步骤

上述算法结束之后,j 所在的位置即为我们寻找的 j

golang代码实现如下:

func partition(arr []int, low int, high int) int {
    i, j := low+1, high
    for true {
        for arr[i] < arr[low] {
            i++
            if i == high {
                break
            }
        }
        for arr[low] < arr[j] {
            j--
            if j == low {
                break
            }
        }
        if i >= j {
            break
        }
        exch(arr, i, j)
    }
    exch(arr, low, j)
    return j
}

对于整个快排算法,我们的 golang实现如下:

func quickSort(arr []int) []int {
    arr = shuffling(arr)
    sort(arr, 0, len(arr)-1)
    return arr
}

func sort(arr []int, low int, high int) {
    if high <= low {
        return
    }
    j := partition(arr, low, high)
    sort(arr, low, j-1)
    sort(arr, j+1, high)
}
func partition(arr []int, low int, high int) int {
    i, j := low+1, high
    for true {
        for arr[i] < arr[low] {
            i++
            if i == high {
                break
            }
        }
        for arr[low] < arr[j] {
            j--
            if j == low {
                break
            }
        }
        if i >= j {
            break
        }
        exch(arr, i, j)
    }
    exch(arr, low, j)
    return j
}
func exch(arr []int, a int, b int) {
    temp := arr[a]
    arr[a] = arr[b]
    arr[b] = temp
}

时间复杂度:

最好情况 O(nlogn)
最坏情况 O(n^2)

由于我们添加了洗牌方法(见基本排序实现),所以整个数组趋向于无序,快速排序往往能取得比其他排序好的多的性能


参考文献:
Dynamic Connectivity - 普林斯顿大学 | Coursera

相关文章

  • GO语言实现 一 快速排序(一)

    快速排序被誉为20世纪科学和工程领域的十大算法之一。听名字就能了解,快速排序的特点,就是快 快速排序 快速排序采用...

  • GO语言实现 一 快速排序(二)

    接下来,我们会讨论快速排序的更多细节 标志位的选取 在上篇博文中,我们讲到了标志位的选取一般是取数组第一个元素,但...

  • go语言实现快速排序

  • 数据结构02-高效排序算法

    第二章 高效排序算法 第二章 高效排序算法一、快速排序基本思想快速排序图示一次划分C 语言实现Java 语言实现算...

  • 选择排序、冒泡排序、插入排序、快速排序

    在工作中,常用的“选择排序”、“冒泡排序”、“插入排序”、“快速排序”这四种排序方式。我试着用go语言编写一下这四...

  • go实现快速排序

    第一,单线程实现快速排序 第二,多线程实现快速排序

  • 排序算法

    快速排序:顾名思义就是快,c语言底层实现的排序算法主要就是用的快速排序。快速排序,最好时间复杂度是nlogn,最坏...

  • GO语言实现 一 基本排序

    基本排序包括简单选择排序和插入排序,本文将就这两种排序进行 golang语言实现,并引出希尔排序 一.简单选择排序...

  • 一个Go语言程序示例

    本文档介绍来自《Go语言编程》的简单Go语言程序示例。 程序结构 本程序是一个排序算法的实现,程序结构如下所示 创...

  • 排序算法Java实现

    本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序...

网友评论

    本文标题:GO语言实现 一 快速排序(一)

    本文链接:https://www.haomeiwen.com/subject/iftkpktx.html