- 博客(19)
- 资源 (1)
- 收藏
- 关注
原创 64匹马8个跑道问题
64匹马,8个跑道,假设马发挥稳定且没有体力问题,需要多少场可以决出所有名次(前4名/前8名)。方法一:归并方法,49场1). 把64匹马分成8组,先把每组排个序,共8场比赛。2). 把这8组8匹马两两合并为4组16匹马的有序组,每次合并需要3场比赛。这里就是本题的关键所在:从其中任意选出两组,合并后的前4名肯定在两组的前4名这8匹马里,这8匹比一场就把两组的前4比出来了;对剩下的12马采取同样
2015-08-30 00:40:48 11334 9
转载 25匹马5个跑道问题
问题是这样的:一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少 得比多少场才能知道跑得最快的5匹马(或者3匹马)。 注意: "假设每匹马都跑的很稳定" 的意思是在上一场比赛中A马比B马快,则下一场比赛中A马依然比B马快。 稍微想一下,可以采用一种 竞标赛排序(T
2015-08-30 00:23:36 2157 3
转载 桶排序-Bucket Sort
转载:http://hxraid.iteye.com/blog/647759从《基于比较的排序结构总结 》中我们知道:全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设 ,来避免绝大多数的“比较”操作。桶排序就是这样的原理。桶排序的基本思想假设有一组
2015-08-29 13:29:23 486
原创 基数排序-RadixSort
一. 算法描述基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程: (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中) (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中 重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位) 以【521 3
2015-08-29 11:40:50 371
原创 冒泡排序-Bubble Sort
算法思想:设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将两个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成。代码基本实现:void bubbleSort(vector<int> &nums){ int length=nums.siz
2015-08-28 17:25:00 447
原创 选择排序-SelectionSort
算法思想: 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素,然后将元素调整到指定位置。代码:class SlectionSort{public: void selectionSort(vector<int> &nums){ int length=n
2015-08-28 17:13:18 443
原创 插入排序-InsertSort
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。插入排序步骤: 1.在有序序列中查找插入点 2.从插入点开始向后移动数据(1、2可合并,边查找边移动数据) 3.插入数据插入排序根据查找插入点方法不同分为:直接插入排序和二分插入排序。代码直接插入排序:class InsertSort
2015-08-28 11:25:49 505
原创 leetcode 154 : Find Minimum in Rotated Sorted Array II
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed?Would this affect the run-time complexity? How and why?Suppose a sorted array is rotated at some pivot unknown to y
2015-08-26 17:24:37 316
原创 leetcode 153 : Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).Find the minimum element.You may assume no duplicate exists in the array.代码cla
2015-08-26 17:19:26 254
原创 leetcode 81 : Search in Rotated Sorted Array II
Follow up for “Search in Rotated Sorted Array”: What if duplicates are allowed?Would this affect the run-time complexity? How and why?Write a function to determine if a given target is in the array.代码
2015-08-26 17:04:01 348
原创 leetcode 33 : Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If found in the array return its index
2015-08-26 17:01:14 327
原创 leetcode 240 : Search a 2D Matrix II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:Integers in each row are sorted in ascending from left to right. Integers in each co
2015-08-26 16:56:33 297
原创 leetcode 74 : Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:Integers in each row are sorted from left to right. The first integer of each row is
2015-08-26 16:52:22 322
原创 二分查找-BinarySearch
算法基本思想前置条件:一个有序的序列(假设升序排列),在序列中查找指定元素 算法:首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。算法代码int binarySearch(vector<int> &vec, int value){ int left,mid,r
2015-08-26 16:21:49 383
原创 归并排序-MergeSort
归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括”从上往下”(递归方式)和”从下往上”(非递归方式)2种方式。从上往下的归并排序:利用了分治的思想。它基本包括3步: ① 分解 – 将当前区间一分为二,即求分裂点 mid = (low + high)/2; ② 求解 – 递归地对两个子区间a[low…mid] 和 a[mid+1…high]进行归并排
2015-08-26 11:14:39 369
原创 堆排序-HeapSort
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)。 二叉堆的定义 - 二叉堆是完全二叉树或者是近似完全二叉树。 - 二叉堆满足二个特性: - 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 - 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小
2015-08-25 18:10:26 328
原创 快速排序-QuickSort
快速排序主要应用了分治的思想。分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解分治模型在每一层递归上都有三个步骤: -分解(Divide):将原问题分解成一系列子问题。 -解决(Conquer):递归的解各个子问题。若子问题足够小,则直接求解。 -合并(Combine):将子问题的结果合并成原问题的解。快速排序的递归方法://分治的解决部分:p
2015-08-25 17:57:35 491
原创 希尔排序-ShellSort
希尔排序,其实就是缩小增量的插入排序。希尔排序算法分析:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序……最后选择增量为1,即使用直接插入排序,使最终数组成为有序。增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 gap[1] > gap[2] > gap[3]
2015-08-25 17:17:27 314
原创 二叉树遍历
二叉树遍历分为前序遍历、中序遍历、后序遍历,三种遍历都分递归遍历和非递归遍历。前序遍历(PreOrderTraverse): //递归前序遍历C++ void preOrder1(BinTree *root) { if(root!=NULL) { coutdat
2015-08-25 15:55:12 458
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人