golang 归并排序,快速排序,堆排序的实现

Golang 实现归并排序,快速排序和堆排序

简介

排序算法的实现是大多数程序员必备的技能之一。在这个过程中,我们考虑三种经典的排序算法之一:归并排序,快速排序和堆排序。我们在学习它们的同时,也在学习使用 Golang 写出高效的排序算法。

归并排序

算法原理

归并排序是基于归并操作的一种排序算法,该算法的核心思想是将一个数组分成两个较小的数组,然后递归地将它们排序,最后再将它们合并来完成排序。它是一个稳定的算法,时间复杂度为 O(nlogn),空间复杂度也为 O(nlogn)。

实现步骤

  1. 将数组划分为两个更小的数组,其中一个包含前半部分,另一个包含后半部分。
  2. 递归地对这两个数组进行排序,直到只有一个元素。
  3. 排序时需要合并两个数组,合并时需要遍历两个数组,将较小的元素移动到新的数组中。
  4. 最后返回合并之后的结果。

代码示例

下面是归并排序算法的 Golang 实现代码:

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 {
    res := []int{}
    i, j := 0, 0
    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
}

以上代码中,MergeSort 和 merge 都是递归函数,merge 函数合并两个数组并返回一个新的数组。MergeSort 函数将原始数组拆分成两个数组并递归,最后返回合并后的结果。

快速排序

算法原理

快速排序是一种基于比较的排序算法,它使用分治法来将待排序的元素划分为较小和较大的子集,然后使用递归快速排序子集,直到子集为空或只包含一个元素。它是一个原地排序算法,平均时间复杂度为 O(nlogn),最坏情况为 O(n^2),空间复杂度为 O(1)。

实现步骤

  1. 选择数组中的一个基准元素。
  2. 遍历数组,将小于基准元素的放在左侧,大于等于基准元素的放在右侧。
  3. 对左右两侧的子数组进行递归,重复以上步骤直到子数组不能再分割。
  4. 最后将左侧、基准元素、右侧三部分合并到一起。

代码示例

以下是快速排序算法的 Golang 实现代码:

func QuickSort(arr []int, left, right int) {
    if left < right {
        mid := partition(arr, left, right)
        QuickSort(arr, left, mid-1)
        QuickSort(arr, mid+1, right)
    }
}

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

以上代码中,QuickSort 函数是递归函数,它定义了一个基准元素 pivot 和两个指针 left 和 right。QuickSort 函数随时分割子数组,从而实现快速排序。partition 函数是将数组分隔成较小值的子数组和较大值的子数组的关键函数。

堆排序

算法原理

堆排序是一种原地的排序,它是一种选择排序算法,它首先构建一个二叉树,并将其转换为堆,然后将所有的元素从堆中提取和删除,直到堆为空为止。它的时间复杂度为 O(nlogn),空间复杂度为 O(1)。

实现步骤

  1. 将数组构建成一个大根堆或小根堆。
  2. 循环地从堆顶选出最大或最小元素,并将其放在新数组的末尾。
  3. 调整堆结构,重新构建堆。
  4. 重复步骤 2 和 3 直到堆为空。

代码示例

以下是堆排序的 Golang 实现代码:

func HeapSort(arr []int) []int {
    length := len(arr)
    for i := length/2 - 1; i >= 0; i-- {
        heapify(arr, length, i)
    }
    for i := length - 1; i >= 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    }
    return arr
}

func heapify(arr []int, length, p int) {
    left, right := p*2+1, p*2+2
    largest := p
    if left < length && arr[left] > arr[largest] {
        largest = left
    }
    if right < length && arr[right] > arr[largest] {
        largest = right
    }
    if largest != p {
        arr[p], arr[largest] = arr[largest], arr[p]
        heapify(arr, length, largest)
    }
}

以上代码中,HeapSort 函数首先构建一个最大堆,然后反复从堆的根节点提取最大元素,并重构最大堆。heapify 函数维护堆的性质,并保证父节点总是大于等于子节点的值。

结束语

以上就是归并排序、快速排序和堆排序算法的实现。这些算法都是经典的排序算法,也是每个程序员必须掌握的算法之一。在实际生产过程中,可以根据实际情况,选择不同的算法进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang 归并排序,快速排序,堆排序的实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • c语言实现基数排序解析及代码示例

    c语言实现基数排序解析及代码示例 前言 基数排序是一种特殊的排序算法,它的时间复杂度为O(dn),其中d表示数据位数,n表示数据个数。它可以用于排序整数、字符串、链表等数据类型。本篇攻略通过讲解基数排序的原理、流程和C语言实现,希望能够帮助大家更好地理解和应用基数排序算法。 基数排序原理 基数排序是一种非比较排序算法,它的实现基于按照键值的每位数字对待排序数…

    算法与数据结构 2023年5月19日
    00
  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

    算法与数据结构 2023年5月19日
    00
  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

    算法与数据结构 2023年5月19日
    00
  • PHP 快速排序算法详解

    PHP 快速排序算法详解 算法原理 快速排序(Quick Sort)是一种高效的排序算法,它的核心思想是分而治之,在序列中选择一个基准元素,将小于基准元素的值放置在基准元素左边,大于基准元素的值放置在基准元素右边,然后再对左右子序列分别执行同样的操作,直到序列有序为止。 具体实现过程如下: 选择一个基准元素 $pivot$,可以随机选择一个元素,也可以选择第…

    算法与数据结构 2023年5月19日
    00
  • 排序算法之PHP版快速排序、冒泡排序

    排序算法之PHP版快速排序、冒泡排序 在算法和数据结构中,排序是一种重要的操作,主要目的是将一组无序的数据按照一定的规则进行排序。常见的排序算法有冒泡排序、快速排序、归并排序等。本文将详细介绍php版本的快速排序和冒泡排序的实现。 冒泡排序 冒泡排序是一种最简单的排序算法之一。其思想是从数组的第一个元素开始比较,将大的元素交换到后面,依次比较下去,直到排序完…

    算法与数据结构 2023年5月19日
    00
  • 利用C++的基本算法实现十个数排序

    利用C++的基本算法实现十个数排序 1. 算法选择 排序问题常见的算法有冒泡排序、插入排序、选择排序、快速排序等,它们的时间复杂度不尽相同,但在本题目的情况下,十个数的排序任何算法都可以。 为了方便,本文将使用最简单的冒泡排序算法。 2. 代码实现 冒泡排序算法的基本思路是从头到尾扫描一遍数组,比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们…

    算法与数据结构 2023年5月19日
    00
  • C++超详细分析优化排序算法之堆排序

    C++超详细分析优化排序算法之堆排序 堆排序算法的思路 堆排序算法是一种树形选择排序算法。它的基本思想是:将待排序的序列构造成一个大根堆(或小根堆),此时,整个序列的最大(或最小)值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大(或最小)值),然后将剩余的n-1个序列重新构造成一个堆,这样,每次找出最大(或最小)值的操作…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第一天 七大经典排序【上】

    我会为你详细讲解“算法系列15天速成 第一天 七大经典排序【上】”的完整攻略。 标题 算法系列15天速成 第一天 七大经典排序【上】 内容 本文主要介绍了常用的七大经典排序算法,分别是插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序以及堆排序。对每个算法的特点、实现过程和时间复杂度进行了详细的讲解,同时也对每个算法进行了简单的示例说明。 插入排序 …

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部