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

前言

当前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 := ifor 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 []intvar greater []intfor _, 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 - 1for 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 / 2for gap > 0 {for i := gap; i < n; i++ {temp := arr[i]j := ifor 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) / 2left := 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 heapfor i := n - 1; i >= 0; i-- {// Move current root to endarr[0], arr[i] = arr[i], arr[0]// call max heapify on the reduced heapheapify(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 rootl := 2*i + 1 // left = 2*i + 1r := 2*i + 2 // right = 2*i + 2// If left child is larger than rootif l < n && arr[l] > arr[largest] {largest = l}// If right child is larger than largest so farif r < n && arr[r] > arr[largest] {largest = r}// If largest is not rootif largest != i {arr[i], arr[largest] = arr[largest], arr[i]// Recursively heapify the affected sub-treeheapify(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 arraymax := 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 0count := make([]int, max+1)for i := 0; i < max+1; i++ {count[i] = 0}// Store count of each elementfor i := 0; i < size; i++ {count[arr[i]]++}// Store cumulative count of each elementfor i := 1; i < max+1; i++ {count[i] += count[i-1]}// Create the output arrayoutput := 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 elementsfor 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 bucketsnum := len(arr)buckets := make([][]float64, num)// Add values to bucketsfor 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 arrayk := 0for i := 0; i < num; i++ {sort.Float64s(buckets[i])for _, val := range buckets[i] {arr[k] = valk++}}return arr
}

10. 基数排序

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

// Radix sort implementation in Go
func radixSort(arr []int) {// Find the maximum number to know number of digitsmax := 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 numberfor 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 arroutput := make([]int, n)// Initialize count array as 0count := make([]int, 10)// Store count of occurrences in count[]for i := 0; i < n; i++ {index := (arr[i] / exp) % 10count[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 arrayfor i := n - 1; i >= 0; i-- {index := (arr[i] / exp) % 10output[count[index]-1] = arr[i]count[index]--}// Copy the output array to arr[], so that arr[] now// contains sorted numbers according to current digitfor i := 0; i < n; i++ {arr[i] = output[i]}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT/InstructGPT详解

来源&#xff1a;京东云 海豚数据科学实验室 本文约7000字&#xff0c;建议阅读15分钟 要搞懂ChatGPT&#xff0c;我们必须要先读懂InstructGPT。 前言 GPT系列是OpenAI的一系列预训练文章&#xff0c;GPT的全称是Generative Pre-Trained Transformer&#xff0c;顾名思义&…

我用低代码结合ChatGPT开发,每天多出1小时摸鱼

&#x1f449;腾小云导读 GPT 出现之后&#xff0c;很多人推测大量的软件都会因为其出现而重写。本文主要是低代码平台与 ChatGPT 结合的一些思考以及实践。期望与各位读者一起搭上 AI 这列快车&#xff0c;为开发提提速&#xff5e; &#x1f449;目录 1 背景 2 Demo 演示 3 思…

ChatGPT是智能硬件的春天

智能音箱&#xff0c;一度被亚马逊带领引爆。 国内京东&#xff0c;阿里&#xff0c;百度&#xff0c;小米&#xff0c;腾讯等厂家参下&#xff0c;蓬勃发展。 然而&#xff0c;在2021到2022年&#xff0c;智能音箱就可开始下滑&#xff0c;叮咚音箱退出历史舞台。 转机出现在2…

万字长文剖析ChatGPT

原文链接&#xff1a;https://mp.weixin.qq.com/s/8IFcQDhsLIWJIx8siF-wdQ 简单来说&#xff0c;ChatGPT 是自然语言处理&#xff08;NLP&#xff09;和强化学习&#xff08;RL&#xff09;的一次成功结合&#xff0c;考虑到读者可能只熟悉其中一个方向或者两个方向都不太熟悉…

推荐:ChatGPT指令大全(37个!)

使用时&#xff0c;可参考这些语境。会问问题&#xff0c;才是最重要的。 参考&#xff1a;AGI 时代必备&#xff1a;《提问的艺术——让ChatGPT导出高质量答案》 1. 写报告&#xff1a;我现在正在 [报告的情境与目的]。我的简报主题是 [主题]&#xff0c;请提供 [数字] 种开头…

亚马逊高调宣布入局ChatGPT大战,CEO :个人免费使用,改变所有体验,弯道超车!...

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 转载自&#xff1a;机器之心 新工具叫 Bedrock&#xff0c;用于一揽子替代 ChatGPT 和 DALL-E 2&#xff0c;并支持了 Titan 大模型。 一夜之间&#xff0c;亚马逊来了个「弯道超车」。 在全球各大科技…

EXCEL 也可以使用chatGPT了,教程来了

1、打开EXCEL ,点击插入&#xff0c;选择加载项&#xff1a;如下图 2、搜索Openai ,点击右侧添加BrainiacHelper 插件即可&#xff1b; 3、登录openai 右上角获取openai apikeys &#xff1b; 完成以上操作就可以在Excel 中使用 chatGPT了&#xff0c; 喜欢的小伙伴可以试试哦…

突发!ChatGPT 开始大面积封号,注册功能关闭!亚洲成重灾区,网友自救喊话:不要登录,不要登录...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; ​ “不要登录ChatGPT&#xff01;” “暂时远离人工智能和ChatGPT概念板块高位股&#xff01;” 就在这两天&#xff0c;一些关于ChatGPT的疾呼突然在各种社交平台和群聊刷屏了。 …

chatgpt入门体验【具体操作】

chatgpt入门体验【具体操作】 前提操作步骤遇到问题 前提 这个得花点小烟钱才行。 操作步骤 1、账号注册 https://chat.openai.com/auth/login 2、虚拟手机号 https://sms-activate.org/ 我是用的是网易邮箱 充值 可使用支付宝 选择openAI 3、打开openAI 注册输入验证码 …

一键部署属于自己的ChatGPT-Next-Web

完整功能刚需&#xff1a; OpenAI 注册登录之后给的 api Key GitHub账号 Netlify账号 Tip&#xff1a; 注册 OepenAI账号 需要用国外手机号 这里建议去一些渠道购买账号 十块钱不到如果访问 OpenAI 的话 一定要挂欧美节点 否则禁止IP访问 概率会被封号为什么用 Netlify 托…

ChatGPT - 横看成岭侧成峰

定义 ChatGPT 是什么&#xff1f; ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序&#xff0c;由 OpenAI 公司于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ChatGPT以对话方式进行交互&#xff0c;可以用于包括自动文本生成、自…

ChatGPT探索系列之一:理解ChatGPT的背景和应用领域

文章目录 前言一、ChatGPT的背景1. ChatGPT的背景&#xff1a;深入解析2 ChatGPT的最新架构&#xff1a;GPT-4 二、ChatGPT的应用场景1.ChatGPT在教育领域的应用2. ChatGPT在医疗领域的应用3. ChatGPT在金融领域的应用4. 客户服务领域 总结 前言 ChatGPT发展到目前&#xff0c…

ChatGPT 账号咋了:Sorry, you have been blocked

问题描述 早晨登录&#xff0c;提示如下图所示 别慌!!!! 真的可能会慌&#xff0c;因为很多资料还没有导出保存&#xff0c;账号不能用&#xff0c;很多的工作白做了 解决办法 切换代理IP &#xff0c;每个工具可能操作方法不一样清除openAI相关的cookies 再次登录成功…

chatgpt赋能python:Python查找手机号码

Python查找手机号码 在今天的数字时代&#xff0c;手机号码已成为每个人生活中必不可少的一部分。虽然我们可以轻松地拥有一部手机&#xff0c;但是对于那些需要通过电话来联系客户、朋友或家庭成员的人&#xff0c;获取正确的手机号码就显得尤为重要。 这就是为什么Python查…

从开发一个插件看,安卓gradle插件适配AGP8.0

transform API没学会&#xff1f;不用学了&#xff0c;AsmClassVisitorFactory更简单 前言从零开始&#xff0c;构建一个兼容AGP8.0的插件插件发布为什么适配AGP8.0没用8.0.0版本&#xff1f;同一插件如何注册多个转换任务/顺序执行多个转换任务InstrumentationParameters&…

Android开发:kotlin封装 Intent 跳转Activity,报ActivityNotFoundException 问题

Android开发&#xff1a;kotlin封装 Intent 跳转Activity&#xff0c;报ActivityNotFoundException 问题 前言起因问题解决方法一&#xff1a;方法二&#xff1a; 总结 前言 近期用kotlin进行项目开发&#xff0c;写了挺多次跳转Activity页面代码&#xff0c;发现和Java有一点…

安卓APP源码和设计报告——运动健身教学

实 验 报 告 课程名称 实验名称 指导教师 专业 班级 学号 姓名 目 录 一、设计背景31. 需求分析32. 课题研究的目的和意义3二、系统需求分析与开发环境31. 系统功能需求32.系统界面需求43.开发环境4三、系统设计4四、系统测试51.脑模拟器测试6五、总结与展望6六、重要…

安卓APP源码和设计报告——仿淘宝水果商城

项目名称 仿淘宝水果商城项目概述 随着互联网技术地高速发展&#xff0c;计算机进入到每一个人的生活里&#xff0c;从人们的生活方式到整个社会的运转都产生了巨大的变革&#xff0c;而在信息技术发达的今天&#xff0c;互联网的各种娱乐方式都在渗透到人们的生活方式之中&am…

对标ChatGPT3.5,支持手机电脑网页使用,无需魔法

说到 Claude 是什么&#xff0c;大家可能没听说过。 但是说到 OpenAI&#xff0c;说到 ChatGPT&#xff0c;相信大家一定听说过&#xff0c;玩过。 PS&#xff1a;关于 Claude 网页版的注册教程&#xff0c;我之前已经写过文章了&#xff0c;现在额外介绍如何使用手机App和电脑…

安卓调试|一文归纳总结adb调试工具常规命令

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…