使用ChatGPT生成了十种排序算法

news2024/12/23 14:06:45

前言

当前ChatGPT非常火爆,对于程序员来说,ChatGPT可以帮助编写很多有用的代码。比如:在算法的实现上,就可以替我们省很多事。所以,小试牛刀一下,看看ChatGPT生成了排序算法怎么样?

简介

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

image

1. 冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置。这样操作后数组最右端的元素即为该数组中所有元素的最大值。接着对该数组除最右端的n-1个元素进行同样的操作,再接着对剩下的n-2个元素做同样的操作,直到整个数组有序排列。

// Bubble sort algorithm implementation in Go
// 生成冒泡排序
func bubbleSort(arr []int) {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        for j := 0; j < n-i-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
} 

// Example usage:
// arr := []int{64, 34, 25, 12, 22, 11, 90}
// bubbleSort(arr)
// fmt.Println("Sorted array:", arr)

2. 选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr0),则将最小值min1和arr0交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr1,则交换这两个数字,依次类推,直到数组arr有序排列。算法的时间复杂度为O(n^2)。

// Selection sort implementation in Go
func selectionSort(arr []int) {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        minIndex := i
        for j := i + 1; j < n; j++ {
            if arr[j] < arr[minIndex] {
                minIndex = j
            }
        }
        arr[i], arr[minIndex] = arr[minIndex], arr[i]
    }
}

// Example usage
func main() {
    arr := []int{64, 25, 12, 22, 11}
    selectionSort(arr)
    fmt.Println("Sorted array:", arr)
}

3. 快速排序

快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。一趟快速排序的具体过程可描述为:从待排序列中任意选取一个记录(通常选取第一个记录)作为基准值,然后将记录中关键字比它小的记录都安置在它的位置之前,将记录中关键字比它大的记录都安置在它的位置之后。这样,以该基准值为分界线,将待排序列分成的两个子序列。它是处理大数据最快的排序算法之一了。该算法时间复杂度为O(n log n)。

// Here is an implementation of the quicksort algorithm in Go:

func quicksort(arr []int) []int {
    if len(arr) < 2 {
        return arr
    }

    pivot := arr[0]
    var less []int
    var greater []int

    for _, num := range arr[1:] {
        if num <= pivot {
            less = append(less, num)
        } else {
            greater = append(greater, num)
        }
    }

    sorted := append(quicksort(less), pivot)
    sorted = append(sorted, quicksort(greater)...)

    return sorted
}

// To use this function, simply pass in an unsorted slice of integers:
// sorted := quicksort([]int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5})
// fmt.Println(sorted) // Output: [1 1 2 3 3 4 5 5 5 6 9]

4. 插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。例如要将数组arr=4,2,8,0,5,1排序,可以将4看做是一个有序序列,将2,8,0,5,1看做一个无序序列。无序序列中2比4小,于是将2插入到4的左边,此时有序序列变成了2,4,无序序列变成了8,0,5,1。无序序列中8比4大,于是将8插入到4的右边,有序序列变成了2,4,8,无序序列变成了0,5,1。以此类推,最终数组按照从小到大排序。该算法的时间复杂度为O(n^2)。

// Insertion sort implementation in Go
func insertionSort(arr []int) {
    for i := 1; i < len(arr); i++ {
        key := arr[i]
        j := i - 1
        for j >= 0 && arr[j] > key {
            arr[j+1] = arr[j]
            j = j - 1
        }
        arr[j+1] = key
    }
}

// Call the insertion sort function with an example array
func main() {
    arr := []int{12, 11, 13, 5, 6}
    insertionSort(arr)
    fmt.Println("Sorted array:", arr)
}

5. 希尔排序

希尔排序(Shell’s Sort)在插入排序算法的基础上进行了改进,算法的时间复杂度与前面几种算法相比有较大的改进,但希尔排序是非稳定排序算法。其算法的基本思想是:先将待排记录序列分割成为若干子序列分别进行插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。该算法时间复杂度为O(n log n)。

// ShellSort implements the Shell sort algorithm
func ShellSort(arr []int) {
    n := len(arr)
    gap := n / 2
    for gap > 0 {
        for i := gap; i < n; i++ {
            temp := arr[i]
            j := i
            for j >= gap && arr[j-gap] > temp {
                arr[j] = arr[j-gap]
                j -= gap
            }
            arr[j] = temp
        }
        gap /= 2
    }
} 

// The above code implements the Shell sort algorithm in Go.

6. 归并排序

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。代价是需要额外的内存空间。若将两个有序表合并成一个有序表,称为2-路归并。 该算法时间复杂度为O(n log n)。

// Here is an implementation of 归并排序 (merge sort) in Go:

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 {
    result := make([]int, 0)

    for len(left) > 0 || len(right) > 0 {
        if len(left) == 0 {
            return append(result, right...)
        }
        if len(right) == 0 {
            return append(result, left...)
        }
        if left[0] <= right[0] {
            result = append(result, left[0])
            left = left[1:]
        } else {
            result = append(result, right[0])
            right = right[1:]
        }
    }

    return result
}

// To use this implementation, simply call mergeSort() with an array of integers as an argument. The function will return a sorted array.

7. 堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:每个结点的值都大于等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于等于其左右孩子结点的值,称为小顶堆。该算法时间复杂度为O(n log n)。

// HeapSort function implements the heap sort algorithm
func HeapSort(arr []int) {
    n := len(arr)

    // Build heap (rearrange array)
    for i := n/2 - 1; i >= 0; i-- {
        heapify(arr, n, i)
    }

    // One by one extract an element from heap
    for i := n - 1; i >= 0; i-- {
        // Move current root to end
        arr[0], arr[i] = arr[i], arr[0]

        // call max heapify on the reduced heap
        heapify(arr, i, 0)
    }
}

// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
func heapify(arr []int, n, i int) {
    largest := i // Initialize largest as root
    l := 2*i + 1 // left = 2*i + 1
    r := 2*i + 2 // right = 2*i + 2

    // If left child is larger than root
    if l < n && arr[l] > arr[largest] {
        largest = l
    }

    // If right child is larger than largest so far
    if r < n && arr[r] > arr[largest] {
        largest = r
    }

    // If largest is not root
    if largest != i {
        arr[i], arr[largest] = arr[largest], arr[i]

        // Recursively heapify the affected sub-tree
        heapify(arr, n, largest)
    }
} 

// Example usage:
// arr := []int{12, 11, 13, 5, 6, 7}
// HeapSort(arr)
// fmt.Println(arr) // Output: [5 6 7 11 12 13]

8. 计数排序

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。计数排序不是基于比较的排序算法。而是 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。该算法时间复杂度为O(n+k)。

// Counting sort implementation in Go
// 计数排序实现

func countingSort(arr []int) []int {
    size := len(arr)
    if size == 0 {
        return arr
    }

    // Find the maximum element in the array
    max := arr[0]
    for i := 1; i < size; i++ {
        if arr[i] > max {
            max = arr[i]
        }
    }

    // Create a count array to store count of individual elements and initialize count array as 0
    count := make([]int, max+1)
    for i := 0; i < max+1; i++ {
        count[i] = 0
    }

    // Store count of each element
    for i := 0; i < size; i++ {
        count[arr[i]]++
    }

    // Store cumulative count of each element
    for i := 1; i < max+1; i++ {
        count[i] += count[i-1]
    }

    // Create the output array
    output := make([]int, size)
    for i := size - 1; i >= 0; i-- {
        output[count[arr[i]]-1] = arr[i]
        count[arr[i]]--
    }

    // Copy the output array to arr, so that arr now contains sorted elements
    for i := 0; i < size; i++ {
        arr[i] = output[i]
    }

    return arr
}

9. 桶排序

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。为了使桶排序更加高效,我们需要做到这两点:在额外空间充足的情况下,尽量增大桶的数量;使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中。该算法时间复杂度为O(n+k)。

// Bucket sort implementation in Go
// 桶排序实现

func bucketSort(arr []float64) []float64 {
    // Create buckets
    num := len(arr)
    buckets := make([][]float64, num)

    // Add values to buckets
    for i := 0; i < num; i++ {
        bucketIndex := int(arr[i] * float64(num))
        buckets[bucketIndex] = append(buckets[bucketIndex], arr[i])
    }

    // Sort buckets and place back into input array
    k := 0
    for i := 0; i < num; i++ {
        sort.Float64s(buckets[i])
        for _, val := range buckets[i] {
            arr[k] = val
            k++
        }
    }

    return arr
}

10. 基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。该算法时间复杂度为O(n+k)。

// Radix sort implementation in Go
func radixSort(arr []int) {
    // Find the maximum number to know number of digits
    max := arr[0]
    for i := 1; i < len(arr); i++ {
        if arr[i] > max {
            max = arr[i]
        }
    }

    // Do counting sort for every digit. Note that instead
    // of passing digit number, exp is passed. exp is 10^i
    // where i is current digit number
    for exp := 1; max/exp > 0; exp *= 10 {
        countingSort(arr, exp)
    }
}

// A utility function to do counting sort of arr[] according to
// the digit represented by exp.
func countingSort(arr []int, exp int) {
    n := len(arr)

    // The output array elements that will have sorted arr
    output := make([]int, n)

    // Initialize count array as 0
    count := make([]int, 10)

    // Store count of occurrences in count[]
    for i := 0; i < n; i++ {
        index := (arr[i] / exp) % 10
        count[index]++
    }

    // Change count[i] so that count[i] now contains actual
    // position of this digit in output[]
    for i := 1; i < 10; i++ {
        count[i] += count[i-1]
    }

    // Build the output array
    for i := n - 1; i >= 0; i-- {
        index := (arr[i] / exp) % 10
        output[count[index]-1] = arr[i]
        count[index]--
    }

    // Copy the output array to arr[], so that arr[] now
    // contains sorted numbers according to current digit
    for i := 0; i < n; i++ {
        arr[i] = output[i]
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站搭建之配置tomcat

【 本次配置架构】 【安全配置】 1.删除后台登录 在tomcat安装目录下的/conf文件下编辑tomcat-users.xml,删除里面带有标签的内容块&#xff0c;默认这部分是被注释了的。注释了任然会显示后台登录&#xff0c;需要彻底删除。 进入末行模式&#xff0c;也就是使用vim进去后&…

Flask开发之环境搭建

目录 1、安装flask 2、创建Flask工程 ​编辑 3、初始化效果 4、运行效果 5、设置Debug模式 6、设置Host 7、设置Port 8、在app.config中添加配置 1、安装flask 如果电脑上从没有安装过flask&#xff0c;则在命令行界面输入以下命令&#xff1a; pip install flask 如果电…

【MFAC】基于偏格式动态线性化的无模型自适应控制(Matlab代码)

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 &#x1f449;对应书本 4.3 单输入单输出系统(SISO)偏格式动态线性化(PFDL)的无模型自适应控制(MFAC) 上一篇博客介绍了基于紧格式动态线性化的无模型…

C++每日一练:打家劫室(详解动态规划法)

文章目录 前言一、题目二、分析三、代码总结 前言 这题目出得很有意思哈&#xff0c;打劫也是很有技术含量滴&#xff01;不会点算法打劫这么粗暴的工作都干不好。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 题目名称&#xff1a; 打家…

实现Newton方法的最小化函数(pytorch)

首先&#xff0c;我们要明确需求 def newton(theta, f, tol 1e-8, fscale1.0, maxit 100, max_half 20) ● theta是优化参数的初始值的一个向量。 ● f是要最小化的目标函数。该函数应将PyTorch张量作为输入&#xff0c;并返回一个张量。 ● tol是收敛容忍度。 ● fscale 粗…

【Leetcode -328.奇偶链表 - 725.分隔链表】

Leetcode Leetcode -328.奇偶链表Leetcode - 725.分隔链表 Leetcode -328.奇偶链表 题目&#xff1a;给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &am…

苏州百特电器有限公司网站设计

苏州百特电器有限公司网站设计 五一假期作业企业门户网站布局设计 基于 <div> 的企业门户网站设计 by 小喾苦 我这里仅仅是使用 html css 来实现这个网站的效果&#xff0c;并不是宣传这个网站(现在这个网站已经过时并且无法进入) 实现效果 https://xkk1.github.io/…

出差在外,远程访问企业局域网象过河ERP系统「内网穿透」

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 转载自远程穿透文章&#xff1a;公网远程访问公司内网象过河ERP系统「内网穿透」 概述 ERP系统对于企业来说重要性不言而喻&am…

初识中央处理器CPU

目录 一、CPU功能 1.控制器功能 2.运算器功能 3.功能执行顺序 4.其他功能 二、CPU结构图 1.CPU与系统总线 2.CPU内部结构 3.运算器中的寄存器组 4.控制器中的寄存器组 三、执行指令的过程 1.指令周期的基本概念 2.完整的指令周期流程 3.数据通路 4.指令周期的数据…

React超级简单易懂全面的有关问题回答(面试)

目录 React事件机制&#xff1a; 2、React的事件和普通的HTML有什么不同&#xff1a; - 事件命名的规则不同&#xff0c;原生事件采用全小写&#xff0c;react事件采用小驼峰 3、React组件中怎么做事件代理&#xff1f;他的原理是什么&#xff1f; 4、React高阶组件、Rend…

【SpringBoot】 整合RabbitMQ 保证消息可靠性传递

生产者端 目录结构 导入依赖 修改yml 业务逻辑 测试结果 生产者端 目录结构 导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>&…

无人机集群路径规划:淘金优化算法(Gold rush optimizer,GRO)提供MATLAB代码

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。 参考文献&#xff1a; K. Zolfi. Gold rush optimizer: A new population-ba…

Python小姿势 - #### Python技术博客:Python多线程编程

Python技术博客&#xff1a;Python多线程编程 你好&#xff0c;这里是自媒体技术博主Aurora&#xff0c;今天我想分享一下Python多线程编程。 首先&#xff0c;什么是多线程编程&#xff1f;多线程编程是一种让多个线程同时执行的编程方式&#xff0c;它可以让程序的执行更加高…

2023年华中杯C题计算结果

经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。对应的详细的写作视频教程&…

推荐一款网站内链爬取python脚本

目标 使用 web-tools 提供的webSpider来爬取网站内链&#xff0c;并且将其导出。 webSpider介绍&#xff1a; 官网链接&#xff1a;https://web-tools.cn/web-spider 仓库地址&#xff1a;https://github.com/duerhong/web-spider Web Spider 专门用于爬取网站内链&#xf…

C++ srand()和rand()用法

参考C rand 与 srand 的用法 计算机的随机数都是由伪随机数&#xff0c;即是由小M多项式序列生成的&#xff0c;其中产生每个小序列都有一个初始值&#xff0c;即随机种子。&#xff08;注意&#xff1a; 小M多项式序列的周期是65535&#xff0c;即每次利用一个随机种子生成的随…

论文学习笔记:Transformer Attention Is All You Need

Transformer: Attention Is All You Need 2022 年年底&#xff0c;一个大语言模型 ChatGPT 横空出世&#xff0c;并且迅速点燃了普罗大众对 AI 的热情&#xff0c;短短两个月&#xff0c; ChatGPT 就成为了史上最快成为上亿月活的应用&#xff0c;并且持续受到关注&#xff0c…

【Vue2.0源码学习】变化侦测篇-Object的变化侦测

文章目录 1. 前言2. 使Object数据变得“可观测”3. 依赖收集3.1 什么是依赖收集3.2 何时收集依赖&#xff1f;何时通知依赖更新&#xff1f;3.3 把依赖收集到哪里 4. 依赖到底是谁5. 不足之处6. 总结 1. 前言 我们知道&#xff1a;数据驱动视图的关键点则在于我们如何知道数据发…

记录docker swarm的使用

在前面的几篇文章中我们依次学习了dockerfile、docker-compose的使用&#xff0c;接下来是docker有一个比较 重要的使用&#xff0c;docker swarm的使用&#xff0c;与dockerfile和docker-compose相比较而言&#xff0c;docker swarm是在 多个服务器或主机上创建容器集群服务准…

Leetcode——66. 加一

&#x1f4af;&#x1f4af;欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、暴力模拟(自己的第一想法)3、官方题解 1、题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组…