随笔分类 - 排序
摘要:希尔排序是对插入排序的改进 基于以下两点性质: 插入排序对于几乎已经排好序的数据操作时,效率高 但插入排序一般来说都是低效的,因为插入排序每次只能将数据移动一位 定义增量gap,即序列被分成gap组 注意这里的分组元素==不是连续的== 盗个图 对每组分别进行直接插入排序,然后缩小增量 它减少了比较
阅读全文
摘要:插入排序是基础简单,同时效率也不高的排序 void insertion_sort(vector<int>& nums) { int n = nums.size(); // 把第一个当作是有序序列,从第二个开始操作 for (int i = 1; i < n; i++) { int j = i; wh
阅读全文
摘要:归并排序也是属于效率较高的排序,时间复杂度O(N logn),而且无论最好最坏情况都是O(N logn) 但是需要额外的O(N)的临时空间存放排序后的数组,这么说来是外部排序为不是内部排序 采用了分治的思想, 先分将数组元素分为最小只有一个元素的单位 分成两部分,称为二路归并,此外还有三路归并 2.
阅读全文
摘要:参考链接 堆排序 概述 堆排序是利用 堆 这种数据结构进行排序的一种排序算法,堆排序是一种选择排序(每次选出序列中 最大 / 最小 元素) 它的最好和最坏时间复杂度都是O(n logN) 升序->大顶堆 降序->小顶堆 堆 堆是具有以下性质的完全二叉树: 因为是完全二叉树,所以可以映射为一个一维数组
阅读全文
摘要:概述 内部排序 不稳定 最好最坏都是O(N2) 原地排序空间O(1) 思路 先从待排序列中找出最小(大)的元素,放到已排序列的首位 从待排序列中找出最小(大)的元素,追加到已排序列 重复2直到排序完成 实现 template<typename T> void selection_sort(vecto
阅读全文
摘要:因为打算去找实习了,所以把之前学过、写到简历上的算法再复习一遍 冒泡排序 首先,快排是对冒泡排序的优化,那么回顾一下冒泡排序是怎么样的? 思路 冒泡排序是基于比较的排序 对于待排序列,从第一个元素开始,将当前元素与后一个元素作比较,如果>(<),则将两个元素交换位置 这样一轮结束后,序列末尾就变成了
阅读全文
摘要:快排 快排是对冒泡的改进,采用分治策略 时间复杂度O(n log n),最好情况O(n log n),最坏情况退化为O(n^2^),空间复杂度O(log n) 基本步骤是: 从待排序列中选定一个“基准” 对序列进行“划分”,比“基准”大的元素放到其右边,比“基准”小的元素放到其左边 对“基准”左右两
阅读全文