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日

相关文章

  • Java实现快速排序和堆排序的示例代码

    Java实现快速排序和堆排序是经常被面试官提问的面试题目之一。下面是一份攻略,来帮助大家快速掌握这两种排序算法。 快速排序 快速排序(Quick Sort)是一种基于分治思想实现的排序算法,其主要思路是通过分区(Partition)操作将一个数组分成两个子数组,再分别对子数组进行排序,从而达到整个数组有序的目的。 以下是Java实现快速排序的示例代码: pu…

    算法与数据结构 2023年5月19日
    00
  • C语言实现九大排序算法的实例代码

    下面我会给您讲解如何实现九大排序算法的实例代码。 1. 排序算法简介 排序算法是计算机科学中重要的算法之一,是将元素按照一定规则进行排列的过程。常见的排序算法包括:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、计数排序和基数排序。 2. 实现九大排序算法的步骤 以下是九大排序算法的实现步骤: 冒泡排序:依次比较相邻的两个元素,将大的向后…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中数组随机排序的实现详解

    下面是我对于“JavaScript中数组随机排序的实现详解”的完整攻略。 概述 在JavaScript中,数组是一个非常有用的数据类型,而随机排序是在处理数组时非常实用的一种技术。本攻略将为你详细讲解如何实现JavaScript数组的随机排序。 方法一:使用sort()方法 JavaScript中的数组包含一个sort()方法,可以对数组中的元素进行排序。我…

    算法与数据结构 2023年5月19日
    00
  • C++选择排序算法实例详解

    C++选择排序算法实例详解 选择排序算法简介 选择排序是一种简单直观的排序算法,其思想是首先找到序列中的最小值,然后将其放到序列的最前面。接着,从剩余序列中找到次小值,将其放到已排序序列的末尾。以此类推,直到排序完成。 选择排序算法的时间复杂度为$O(n^2)$,空间复杂度为$O(1)$,并且由于其算法思想简单,代码实现容易,所以在实际应用中还是比较常见的排…

    算法与数据结构 2023年5月19日
    00
  • Java针对ArrayList自定义排序的2种实现方法

    这里给出针对ArrayList自定义排序的两种方法的详细攻略,分别为使用Comparator接口和使用Comparable接口。 1.使用Comparator接口 Comparator接口是JAVA中的一个接口, 我们可以在其中实现自定义的一些比较规则, 然后使用这些规则去对一些数据进行排序。 接下来是这种方式的实现步骤: 第一步:定义比较规则 我们需要实现…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • C语言基本排序算法之插入排序与直接选择排序实现方法

    C语言基本排序算法之插入排序与直接选择排序实现方法 本文将介绍C语言中两种常见的基本排序算法:插入排序和直接选择排序。我们将会详细阐述它们的实现方法,并提供示例代码来帮助理解和实践。 插入排序 插入排序是一种简单而常见的排序算法,它将待排序的数列分成已排序和未排序两部分,初始时已排序部分只包含一个元素,随着算法的运行,每次从未排序部分中取出第一个元素插入到已…

    算法与数据结构 2023年5月19日
    00
  • Python排序算法之插入排序及其优化方案详解

    Python排序算法之插入排序及其优化方案详解 排序算法是程序员必须学习的基本算法之一,而插入排序算法是其中较为简单和实用的一种,本文将详细介绍插入排序算法的原理以及其常见优化方案。 插入排序算法 插入排序算法是一种简单直观的排序算法,其基本思想是将一个待排序的序列分解成两个子序列,其中一个序列比另一个序列要少一个元素,然后将元素一个一个地从未排序的子序列中…

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