![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序
Knight@96
船世界 陪你乱数
展开
-
计数排序(countSort)
算法思路: 利用空间来换时间的算法 1.找出数组arr最大值与最小值 2.构建一个长度为 [最大值-最小值+1] 的计数数组cnt,记录每个元素出现的次数, 索引:arr[i] - minNum 3. 自前往后,将 计数数组cnt 的元素存入原数组arr 平均时间复杂度:O(n + k) n: 是输入数组长度,k是最大的数的大小 空间复杂度:O(k) 稳定性:稳定 适合场景:待排序序列是在一定范围内的整数。 代码实现一: 1.找出数组arr最大值与最小值 2.构建一个长度为 [最大值-最小值+1] 的计数数原创 2022-03-15 19:51:01 · 140 阅读 · 0 评论 -
基数排序(radixSort)
package main import ( "fmt" "math" ) func main() { arr := []int{3, 17, 746, 5, 24, 569, 6, 4, 2246, 10} radixSort(arr, 0, len(arr)-1, maxBits(arr)) for _, v := range arr { fmt.Println(v) } } func radixSort(arr []int, left, right, bits int) { //原创 2022-03-15 19:42:47 · 502 阅读 · 0 评论 -
堆排序(heapSort)
堆可以分为大根堆和小根堆,是一个完全二叉树 堆排序是根据堆结构设计的一种排序 堆的分类: 大根堆:每个结点的值都大于其左孩子和右孩子结点的值 小根堆:每个结点的值都小于其左孩子和右孩子结点的值 数组中某元素的父结点和左右孩子结点,比如已知索引为i的数,那么 1)父结点索引:(i-1)/2 2)左孩子索引:2i+1 3)右孩子索引:2i+2 堆排序算法思路: 1.首先将数组构造成一个大根堆,堆结构的顶端值为整个数组的最大值 2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为 size原创 2022-03-15 19:21:23 · 684 阅读 · 0 评论 -
计数排序(countSort)
package main import ( "fmt" "math" ) func main() { arr := []int{3, 7, 6, 5, 4, 9, 6, 4, 4, 10} countSort(arr) for _, v := range arr { fmt.Println(v) } } func countSort(arr []int) { maxNum, minNum := math.MinInt64, math.MaxInt64 for _, v := ran原创 2022-03-09 20:56:16 · 214 阅读 · 0 评论 -
归并排序(mergeSort)
算法思路: 1.在未排序序列中找到中间索引mid, 2.递归分治调用左半部分arr[left : mid]与右半部分arr[mid + 1 : right], 3.merge左右两部分 4.不断子序列递归分治 平均时间复杂度:O(nlogn) Master公式:T(N) = 2 * T(N/2) + O(N1), 即最终的结果为:O(N * logN)。 空间复杂度:O(n): 开辟了最长长度为n的辅助数组 稳定性:稳定 if arr[p1] <= arr[p2] { tem[原创 2022-03-09 13:40:20 · 197 阅读 · 0 评论 -
快速排序(quickSort)
快速排序 package main import "fmt" func main() { arr := []int{1, 7, 6, 5, 4, 9} quickSort(arr, 0, len(arr)-1) for _, v := range arr { fmt.Println(v) } } func quickSort(arr []int, left, right int) { if left >= right { return } index := partitio原创 2022-03-08 11:57:59 · 142 阅读 · 0 评论 -
插入排序(insertSort)
普通插入排序: 算法思路: 1.数组分为两个部分:有序部分与无序部分 2.将初始数据分为有序部分和无序部分,每一步将一个无序部分的数据插入到前面已经排好序的有序部分中 3.以此类推,直到所有元素均排序完毕 平均时间复杂度:O(n2) 数据比较次数:(n - 1) + (n - 2) + (n - 3) + …… + 1 = 1/2n2 - 1/2n 数据交换次数:(n - 1) 总复杂度:1/2n2 + 1/2n - 1 最佳时间复杂度:O(n2) 最差时间复杂度:O(n) 空间复杂度:O(1) 稳定性:稳原创 2022-03-06 19:54:00 · 477 阅读 · 0 评论 -
冒泡排序(bubbleSort)
算法思路: 从第一个元素开始,两两比较相邻两个元素数值的大小,数值大的放在后面(从小到大排列) 时间复杂度:O(n2) 空间复杂度:O(1) 稳定性:不稳定 适合场景:少量元素 代码实现: 方式一:双层循环遍历 i : 当前正在排序的索引左边界 j:用来遍历数组,进行冒泡操作 package main import "fmt" func main() { arr := []int{1, 7, 6, 7, 98, 9, -1, 7, 89, 14, -4, -5, -657} bubbleSort(a原创 2022-03-05 16:52:50 · 322 阅读 · 0 评论 -
选择排序(selectSort)
普通选择排序: 算法思路: 1.在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置 2.从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置 3.以此类推,直到所有元素均排序完毕 平均时间复杂度:O(n2) 数据比较次数:(n - 1) + (n - 2) + (n - 3) + …… + 1 = 1/2n2 - 1/2n 数据交换次数:(n - 1) 总复杂度:1/2n2 + 1/2n - 1 最佳时间复杂度:O(n2) 最差时间复杂度:O(n2) 空间复杂度:O(1) 稳定性原创 2022-03-04 20:07:39 · 653 阅读 · 0 评论