排序算法
磨镜台
牢骚太盛防肠断,风物长宜放眼量。
展开
-
归并排序
归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 用途 用途:速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。 复杂度 平...原创 2019-05-27 12:02:58 · 116 阅读 · 0 评论 -
直接插入排序
直接插入排序 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。原理像扑克牌抓牌动作一样,牌堆是无序的,手中的牌有序的,从牌堆中抓牌,并将牌根据手牌大小插入到手牌相应的位置。 算法 将待排序列分成有序数据组和无序数据组 取无序数据组第一个元素,与有序数据组的最后一个元素比较 有序数组依次向后移动,为待插入数据留出合适位置。 数据插入有序数组 重复1-...原创 2019-07-21 09:43:02 · 119 阅读 · 0 评论 -
希尔排序
希尔排序 又称为缩小增量排序。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^2 )复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。 算法 算法先将要排序的一组数按某个增量d(n/2,n为要...原创 2019-07-21 10:38:02 · 125 阅读 · 0 评论 -
计数排序
计数排序 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 场景:10万个数,每个数取值0-999区间内 go实现 借助slice实现 //maxValue 为统计数的最大值 func countingSort(arr []int, maxValue int) { bucket := make([...原创 2019-07-21 11:09:33 · 142 阅读 · 0 评论 -
冒泡排序算法
冒泡排序算法 外层控制行,比较次数数据元素个数减一 内层控制列,比较次数数据元素个数减一,减去已经排序好的元素 相邻数据比大小 满足条件进行交换 go实现 func BubbleSort(arr []int) []int { //len(arr) - 1是比较的次数,例如2个数只用比较1次 for i := 0; i < len(arr) - 1; i++ { //len(a...原创 2019-07-20 19:25:21 · 98 阅读 · 0 评论 -
选择排序
选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。 外层控制行,比较次数数据元素个数减一 内层控制列,从i+1开始,比较次数是len(arr) 将第一个元素当做最小数 使用该数依次向后比较,找真正的最小数,记录下标 当一行比较结束。将index对应值,写到最开始位置。 func SelectSort(arr []i...原创 2019-07-20 23:05:40 · 131 阅读 · 0 评论 -
快速排序
快速排序 算法 初始化基准值游标,首尾游标,首游标为第二个元素 首游标与基准值比较,大于时尾游标和首游标交换,尾游标向前移动。 小于则首游标与基准值交换,首游标和基准值游标向后移动。 重复2和3步,直到首游标遇到尾游标(注意有等号)。 将基准值左边数组和右边数组递归快排。 go实现 func quickSort(arr []int) { if len(arr) <= 1 { ret...原创 2019-07-21 15:25:49 · 171 阅读 · 0 评论 -
堆排序
堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法: 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; ...原创 2019-07-21 19:40:22 · 179 阅读 · 0 评论