
排序
文章平均质量分 73
加油呐
这个作者很懒,什么都没留下…
展开
-
剑指offer: 数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路: 归并排序的思想(先递归,再排序)。array为原来的数组,copy为array复制后的数组,将copy的数组排好序最后依次赋给array。mid每次指...原创 2018-07-08 16:04:20 · 149 阅读 · 0 评论 -
希尔排序
原理:将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列 “基本有序”后,最后再对所有元素进行一次直接插入排序实例:给定一组步长为 { n/2, n/2/2, ... ,1}初始的数组是 { 5,4,9,8,7,6,0,1,3,2} , h是数组的长度10h = h/2 = 5, 因此分为5组, {5,6} {4,0} ...原创 2018-07-12 20:56:00 · 145 阅读 · 0 评论 -
堆排序
原理:将数组R[1.....n]看做一颗完全二叉树的顺序存储结构,利用完全二叉树中父节点和子节点之间的内在关系来选择最小的元素。初始将其调整为一个大顶堆,将堆的最后一个元素与堆顶元素交换,则堆的最后一个元素为最大记录(升序), 接着将前n-1个元素重新调整为一个最大堆,再将堆顶元素与当前堆的最后一个元素交换得到次大的记录,重复直到堆中只剩一个元素为止,这个元素就是最小记录。主要是两个过程: 构建堆...原创 2018-07-12 21:20:35 · 148 阅读 · 0 评论 -
快速排序
快速排序:采用“分而治之”的思想,把大的拆分成小的,小的在拆分成更小的。原理:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。算法步骤:1)分解。将输入的序列 a[m.......n] 划分成两个非空子序列 a[m....k] 和 a[k+1....n] ,...原创 2018-07-07 13:17:31 · 205 阅读 · 0 评论 -
归并排序
归并排序:是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。关键:第一步:划分半子表; 第二步:合并半子表。原理:对于给定的一组记录(假设有n个记录),首先将每两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或者1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。实现代码:测试程序...原创 2018-07-07 11:28:04 · 24261 阅读 · 5 评论 -
剑指offer: 数字在排序数组中出现的次数
题目描述:数字在排序数组中出现的次数思想:二分查找的改进,分别找到数组中数字k第一次以及最后一次出现的次数start,end,最终的次数就是end-start+1定义了两个变量start,end,表示从start遍历到end,求出start和end的中间位置mid,比较mid与k的大小,有三种情况:a[mid] == k : 如果是寻找第一次出现的位置,并且mid的前一个数不是k,则m...原创 2018-07-15 17:19:52 · 194 阅读 · 0 评论