排序
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
堆排序模板
1. 堆排序堆一般可以使用数组或者列表表示,通过数组或者列表的下标关系即可将数组或者列表看成是一棵完全二叉树,也即当前父节点的下标为i,则父节点的左右孩子的下标为2 * i + 1和2 * i + 2,这样就可以将数组表示成完全二叉树的形式。堆排序主要有两个步骤,第一个步骤是对待排序的数组或者列表进行堆化,堆化的目的是将其调整为大根堆或者是小根堆,如果从小到大的顺序排序那么需要将数组或者列表调整为大根堆(所有父节点的元素值大于等于子节点的元素值),这样最大的元素在堆顶,通过交换堆顶元素与最后一个元素那么原创 2021-05-28 09:26:37 · 333 阅读 · 0 评论 -
164 最大间距(枚举、桶排序计算相邻元素的最大间距)
1. 问题描述:给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。示例1:输入: [3,6,9,1]输出: 3解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。示例2:输入: [10]输出: 0解释: 数组元素个数小于 2,因此返回 0。说明:你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。 请尝试在线性时间复杂度和空间复杂度的..原创 2020-12-07 10:07:21 · 265 阅读 · 0 评论 -
二分查找与插入排序的结合使用
1. 问题描述:插入排序中寻找插入位置的操作可以通过二分查找的方法来实现,设计一个使用二分查找法找插入位置的改进的插入排序算法2. 思路分析:① 其实与插入排序没有本质的区别,只是在查找元素的时候查找元素插入的位置的方法不一样而已,我们之前的直接插入排序使用的是从后往前进行扫描进而找到当前元素插入的位置,而现在使用的是二分查找的方法来查找插入的位置,因为在数组中每插入一个元素的时候那么...原创 2019-09-15 23:57:52 · 2205 阅读 · 5 评论 -
找出第k大的关键字
1. 设计一个算法指出在一个无序关键字序列中的某个关键字是该序列中的第几大关键字(从小到大数),序列中关键字均为整型数据,而且各不相同要求比较的次数尽可能少2. 思路分析:关键字k是给定关键字序列中的一个,算法将所有小于它的关键字排到前面,所以大于它的关键字排到后面,假设k的最终位置为j(数组下标),则k为序列中的第j + 1大关键字,这样最大的比较次数为n - 1次3. 下面是具体的...原创 2019-09-15 21:42:15 · 233 阅读 · 0 评论 -
希尔排序
1. 问题描述:给定一个数组序列使用希尔排序算法对数组进行排序并且输出排序结果2. ① 希尔排序又叫做缩小增量排序,其本质还是插入排序,只是在将待排序序列按照某种规则分成几个子序列,分别对这几个子序列进行直接插入排序,这个规则的体现就是增量的选取,如果选择增量为1那么就是直接插入排序。而希尔排序的每一趟排序都会使整个序列变得有序,等到整个序列有序了,那么再使用增量为1的插入排序的话那么就会使得...原创 2019-09-13 17:14:04 · 7578 阅读 · 0 评论 -
二路归并排序的递归写法与迭代写法
1. 问题描述:对于给定的序列使用二路归并排序算法对其进行排序2. 思路分析:① 二路归并排序可以看做是一种分而治之的过程:先将序列分为两半,对每一半分别进行排序之后然后再将其合并起来,而分成的一般又可以使用同样的方法进行排序,之后将会得到一个有序的序列,从上面的描述中我们可以看到问题的规模是在逐渐变小的,而且都是使用相同的办法去解决的,所以第一种方法可以使用递归去解决② 使用递归...原创 2019-07-06 19:14:38 · 1396 阅读 · 0 评论 -
C++algorithm头文件下sort函数的使用
1. sort函数是用来排序的函数,它是根据具体的情况使用不同的排序方法,效率较高,一般来说,不推荐使用C语言中的qsort函数,原因是qsort函数使用起来比较麻烦,涉及到很多指针的操作,而且在sort函数在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n ^ 2)的极端情况,所以我们在排序的时候尽量使用C++下的sort函数来进行排序2. 下面是sort函数的常见用法:...原创 2019-07-05 11:24:10 · 18964 阅读 · 0 评论 -
插入排序
1. 问题描述:给定一个整型数组,使用插入排序算法对其进行排序并且输出排序结果2. 算法思想:每一趟将待排序的关键字按照其值的大小插入到已经排序好的部分有序序列的适当位置上,也就是将待插入的关键字从后往前进行扫描插入到已经排好序的部分有序序列中,下面是具体的代码:#include<stdio.h>void insertSort(int arr[], int len){...原创 2019-07-05 09:21:38 · 158 阅读 · 0 评论 -
选择排序
1. 选择类排序的主要动作是 "选择",简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个关键字,和第一个关键字进行交换,接着从剩下的关键字中继续这种选择和交换,最终使得序列是有序的,时间复杂度为O(n ^ 2)2. 具体的代码如下:#include<stdio.h>#include<iostream>using namespace std...原创 2019-06-20 11:34:40 · 142 阅读 · 0 评论 -
冒泡排序
1. 冒泡排序是通过一系列的 "交换"动作完成的,首先第一个关键字和第二个关键字进行比较,如果第一个大,则两者交换,否则不交换,然后第二个关键字和第三个关键字进行比较,如果第二个关键字大那么两者交换,否则不交换....一直按照这种方法交换下去,最终最大的那个关键字被交换到了最后,一趟冒泡排序完成,经过多趟这样的排序,最终使得整个序列是有序的2. 具体的代码如下:#include<s...原创 2019-06-20 11:28:03 · 183 阅读 · 0 评论 -
快速排序
1. 快速排序也是交换类的排序,它通过多次划分操作实现排序,以升序为例其执行流程可以概括为:每一趟选择当前所有子序列中的一个关键字(通常是第一个)作为枢轴,将子序列中比枢轴小的移到枢轴前面,比枢轴大的移动到枢轴后面,将本趟所有子序列都被枢轴以上述规则划分完毕之后会得到新的一组更短的子序列,他们将成为下一趟划分的初始序列集2. 总结起来就是快速排序的算法思想是:选取无序序列中的一个关键字,先将小...原创 2019-06-20 11:12:55 · 258 阅读 · 0 评论 -
堆排序
1. 堆是一种数据结构,可以把堆看成是一棵完全二叉树,这棵完全二叉树满足:任何一个非叶子节点的值不大于(或者不小于)其左右孩子节点的值,若父节点的值大于左右孩子的值那么这样的堆叫做大顶堆,若父节点的值小于其左右孩子的值那么这样堆叫做小顶堆根据堆的定义可以知道,代表堆的这颗完全二叉树的根节点的值是最大的(或者是最小的)因此将一个无序列调整为一个堆,就可以找到这个序列的最大值或者是最小值,然后将找...原创 2019-06-20 10:23:43 · 186 阅读 · 0 评论 -
基于链表实现的桶排序
1. 问题描述:使用桶排序算法对控制台输入的数字进行排序2. 桶排序涉及到几个问题:① 桶的大小,这里我们可以根据输入的元素的个数来确定桶的大小② 怎么样确定当前元素进入哪一个桶,这里我们使用到的是通过一个哈希函数来进行计算int index = (element * length) / (max + 1);element为当前元素的值,length为桶的大小,max为数...原创 2018-11-29 13:54:44 · 1156 阅读 · 0 评论 -
快速排序(单指针扫描-二分法)
1. 问题描述:快速排序:input:第一行输入整型数组的长度,表示数组的大小第二行输入的是待排序的整型数组output:一行输出排序之后的数组2. 思路分析:快速排序可以使用好几种的方法来进行实现,下面使用的是单指针扫描结合二分法进行分区的方法来进行实现① 首先需要进行分区,求解出一个位置,这个位置左边的元素是小于等于这个位置,这个位置右边的元素大于...原创 2019-04-03 15:46:42 · 1219 阅读 · 0 评论 -
堆排序算法
1. 问题描述:对于一个乱序的整型数组,使用小顶堆算法对数组进行排序,输出排序之后的数组2. 小顶堆算法堆是一种经过排序的完全二叉树,其中任一非叶子节点的数据值均不大于(或不小于)其左子节点和右子节点的值。最大堆和最小堆是二叉堆的两种形式最大堆:根结点的键值是所有堆结点键值中最大者最小堆:根结点的键值是所有堆结点键值中最小者我们可以把数组想象成一颗二叉树,比如当数组元素...原创 2018-12-09 22:01:37 · 6175 阅读 · 3 评论