首页 > 编程语言 >【数据结构与算法】排序算法(Go实现)

【数据结构与算法】排序算法(Go实现)

时间:2023-01-13 11:24:34浏览次数:53  
标签:right nums int len 算法 func Go 数据结构 left

基础排序算法

插入排序

func InsertSort(nums []int) {
    for i := 1; i < len(nums); i++ {
        val := nums[i]
        j := i
        for j > 0 && nums[j-1] > val {
            nums[j] = nums[j-1]
            j--
        }
        nums[j] = val
    }
}

冒泡排序

func BubbleSort(nums []int) {
    for i := len(nums) - 1; i > 0; i-- {
        for j := 0; j < i; j++ {
            if nums[j] > nums[j+1] {
                nums[j], nums[j+1] = nums[j+1], nums[j]
            }
        }
    }
}

选择排序

func SelectSort(nums []int) {
    for i := 0; i < len(nums)-1; i++ {
        minJ := i
        for j := i + 1; j < len(nums); j++ {
            if nums[minJ] > nums[j] {
                minJ = j
            }
        }
        nums[i], nums[minJ] = nums[minJ], nums[i]
    }
}

希尔排序

func ShellSort(nums []int) {
    G := make([]int, 0)
    n := len(nums)
    h := 1
    for h < n {
        G = append(G, h)
        h = h*3 + 1
    }
 
    insertSort := func(g int) {
        for i := g; i < n; i++ {
            val := nums[i]
            j := i
            for j >= g && nums[j-g] > val {
                nums[j] = nums[j-g]
                j -= g
            }
            nums[j] = val
        }
    }

    for i := len(G) - 1; i >= 0; i-- {
        insertSort(G[i])
    }
}

高级排序

快速排序

func QuickSort(nums []int, left, right int) {
    if left >= right {
        return
    }
    i, j := left, right
    x := nums[i]
    for i < j {
        for i < j && nums[j] >= x {
            j--
        }
        nums[i] = nums[j]
        for i < j && nums[i] <= x {
            i++
        }
        nums[j] = nums[i]
    }
    nums[i] = x

    QuickSort(nums, left, i-1)
    QuickSort(nums, i+1, right)
}

归并排序

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

    i, j, k := left, mid+1, 0
    for i <= mid && j <= right {
        if nums[i] < nums[j] {
            tmp[k] = nums[i]
            k++
            i++
        } else {
            tmp[k] = nums[j]
            k++
            j++
        }
    }
    for i <= mid {
        tmp[k] = nums[i]
        k++
        i++
    }
    for j <= mid {
        tmp[k] = nums[j]
        k++
        j++
    }
    for i, j = left, 0; j < k; i, j = i+1, j+1 {
        nums[i] = tmp[j]
    }
}

堆排序

func HeapSort(nums []int) {
    n := len(nums)

    up2down := func(idx int, sz int) {
        for idx < sz {
            j := idx*2 + 1
            if j >= sz {
                break
            }
            if j+1 < sz && nums[j] < nums[j+1] {
                j++
            }
            if nums[idx] < nums[j] {
                nums[idx], nums[j] = nums[j], nums[idx]
            }
            idx = j
        }
    }

    for i := n/2 - 1; i >= 0; i-- {
        up2down(i, n)
    }

    last := n - 1
    for i := len(nums); i > 0; i-- {
        nums[0], nums[last] = nums[last], nums[0]
        last--
        up2down(0, last+1)
    }
}

标签:right,nums,int,len,算法,func,Go,数据结构,left
From: https://www.cnblogs.com/bfstudy/p/17049053.html

相关文章

  • (9)go-micro微服务Redis配置
    目录一go-redis介绍二go-redis安装三redis初始化连接四存储mail邮件五存储token六最后一go-redis介绍Redis(RemoteDictionaryServer),即远程字典服务,是一个开......
  • go 语言 for循环的一个坑
    1、案例1packagemainimport"fmt"typeCardstruct{ idint}funcmain(){ list:=make([]*Card,0) card:=&Card{} forindex:=1;index<10;index......
  • 数据结构与算法 -> 大顶堆与小顶堆
    一、大顶堆大顶堆是一种数据结构,它是一颗完全二叉树,并且满足以下性质:每个节点的值都大于或等于它的子节点的值因此,大顶堆的根节点(也称为堆顶)总是最大的元素二、小......
  • 【Mongodb结合springboot 01】
    一、简介1、什么是MongoDBc++语言编写的,是一个基于分布式文件存储的开源数据库系统;为web应用提供可扩展的高性能数据存储解决方案;MongoDB将数据存储为一个文档,数据结构......
  • 【学习日志】MongoDB为什么选择B树,而MySQL选择B+树实现索引
    先说B树和B+树的区别B树:非叶子节点也存储数据B+树:只有叶子节点存储数据,且所有叶子节点通过指针相连接。为什么MongoDB选择B树而,MySQL选择B+树呢?两种数据结构的区别摆在......
  • leetcode_数据结构_入门_121. 买卖股票的最佳时机
    121.买卖股票的最佳时机  问题:给定一个数组prices,它的第 i个元素 prices[i]表示一支给定股票第i天的价格。只能选择某一天买入这只股票,并选择在未来的某......
  • soft-NMS算法理解
    codeNMS算法的大致过程可以看原文这段话:First,itsortsalldetectionboxesonthebasisoftheirscores.ThedetectionboxMwiththemaximumscoreisselec......
  • deepfefm 算法思维导图
    ......
  • MongoDB 数据类型
    MongoDB数据类型MongoDB将json格式的字符串转化为bson格式的数据进行存储,目的是节省存储空间,但同时不会改变json的样式。BSONisabinaryserializationformat......
  • 常用go开发包
    前言随着时间的推移,语言爱好者已经构建和共享了许多Go框架和库。这些包执行不同的功能,从开发微服务到制作discord机器人,一直到构建Web应用程序!在本文中,我将尝试让您......