摘要: 桶排序代码: 桶排序结果: 基数排序代码: 基数排序结果: 阅读全文
posted @ 2019-01-17 18:32 |旧市拾荒| 阅读(1291) 评论(0) 推荐(0) 编辑
摘要: 堆排序代码: 思想:每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小堆,依次类推,最终得到排序的序列。 堆排序结果: 计数排序代码: 计数排序结果: 阅读全文
posted @ 2019-01-17 12:53 |旧市拾荒| 阅读(464) 评论(0) 推荐(0) 编辑
摘要: 题目一:合并有序数组:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。编写一个方法,将B合并入A并排序。 思路:注意这儿已经说明A的空间足够,那就说明不能再开辟辅助空间。然后合并的话可以采用归并的思想,就能解决这个问题。 代码: 结果: 题目二:逆序对个数:一个数列,如果左边的数大, 阅读全文
posted @ 2019-01-16 22:05 |旧市拾荒| 阅读(557) 评论(0) 推荐(0) 编辑
摘要: 题目:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量10000000。 题目解读:在一个不重复的乱序的自然数组中找到最小的缺失的那个数,比如1,2,3,6,4,5,8,11。那么最小可用id就为7。 代码: 结果: 结论:根据每个解法所消耗的时间即可得出哪个解法的效率更高。所以在 阅读全文
posted @ 2019-01-16 11:02 |旧市拾荒| 阅读(656) 评论(0) 推荐(2) 编辑
摘要: 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 思路:解法一、排序完后返回arr[N/2] O(nlgn) Arrays.sort(arr); System.out.println(arr[N/2]); 解法二、hash统计 解法三、顺序统计,就跟寻找乱序数组中第K大的数解法一 阅读全文
posted @ 2019-01-15 18:08 |旧市拾荒| 阅读(411) 评论(2) 推荐(0) 编辑
摘要: 题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不一定需要排序,使用快速排序中双向分区的扫描方法,这里使用的是优化过后的三点中值法,具体思想一样,只是 阅读全文
posted @ 2019-01-15 16:04 |旧市拾荒| 阅读(593) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n) 思路:可以按照归并的思想,开一个辅助空间,然后再使用快排的单向扫描分区的思想从数组开头扫描,奇数就放在辅助空间左侧,偶数放在右侧,但是这样的话就会消耗一个O(N)空间, 阅读全文
posted @ 2019-01-13 23:38 |旧市拾荒| 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 归并排序(Merge Sort)算法完全依照了分治模式 分解:将 n 个元素分成各含 n/2 个元素的子序列; 解决:对两个子序列递归地排序; 合并:合并两个已排序地子序列以得到排序结果;和快速排序不同的是 归并的划分比较随意,快排重点就是划分 归并的重点就是合并,快排不需要合并 代码: 结果: 阅读全文
posted @ 2019-01-13 22:39 |旧市拾荒| 阅读(649) 评论(0) 推荐(0) 编辑
摘要: 一、快速排序扫描分区法 通过单向扫描,双向扫描,以及三指针分区法分别实现快速排序算法。着重理解分区的思想。 单向扫描分区法 思路:用两个指针将数组划分为三个区间,扫描指针(scan_pos)左边是确认小于等于主元的,扫描指针到某个指针(next_bigger_pos)中间为未知的,因此我们将第二个指 阅读全文
posted @ 2019-01-13 19:12 |旧市拾荒| 阅读(1246) 评论(0) 推荐(0) 编辑
摘要: 分治法 分治法(divide and conquer,D&C):将原问题划分成若干个规模较小而结构与原问题一致的子问题 ;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 容易确定运行时间,是分治算法的优点之一。 分支模式在每一层递归上都有三个步骤: --分解(Divide):将原问题分解 阅读全文
posted @ 2019-01-13 17:28 |旧市拾荒| 阅读(1294) 评论(0) 推荐(1) 编辑
摘要: 代码: 结果: 阅读全文
posted @ 2019-01-13 11:30 |旧市拾荒| 阅读(1136) 评论(0) 推荐(0) 编辑
摘要: 题目:(1,9,2,5,7,3,4,6,8,0,)中最长的递增子序列为(3,4,6,8)。 代码: 结果: 阅读全文
posted @ 2019-01-13 10:44 |旧市拾荒| 阅读(1648) 评论(4) 推荐(0) 编辑
摘要: 题目:有个排序后的字符串,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引。 代码: 阅读全文
posted @ 2019-01-13 09:41 |旧市拾荒| 阅读(548) 评论(1) 推荐(0) 编辑
摘要: 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 思路:这儿题目说了数组是有序的,为了提升效率,可以用二分查找去做,题目上也说了用二 阅读全文
posted @ 2019-01-13 09:15 |旧市拾荒| 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 题目:小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。 思路:这种题目一般从最后结果入手,逆推,假如小白已经在最顶端,那么有f(n)种方式走完所有楼梯,有f(n-1)种方式走完倒数第一个楼梯,有f(n-2)种方式走完倒数第二个楼梯,有f 阅读全文
posted @ 2019-01-12 22:38 |旧市拾荒| 阅读(678) 评论(2) 推荐(0) 编辑