算法
qubernet
这个作者很懒,什么都没留下…
展开
-
经典排序算法(二十二)--图书馆排序(Library Sort)
思路简介,大概意思是说,排列图书时,如果在每本书之间留一定的空隙,那么在进行插入时就有可能会少移动一些书,说白了就是在插入排序的基础上,给书与书之间留一定的空隙,这个空隙越大,需要移动的书就越少,这是它的思路,用空间换时间看红线标的那句话知道,这个空隙留多大,你自己定图书馆排序的关键是分配空间,分配完空间后直接使用插入排序即可进行空间分配的过程这个我实在是找不到相关的资料,没...原创 2011-12-09 09:57:03 · 573 阅读 · 0 评论 -
经典排序算法(二十一)--Cycle Sort
Cycle sort的思想与计数排序太像了,理解了基数排序再看这个会有很大的帮助,圈排序与计数排序的区别在于圈排序只给那些需要计数的数字计数,先看完文章吧,看完再回来理解这一句话所谓的圈的定义,我只能想到用例子来说明,实在不好描述待排数组[ 6 2 4 1 5 9 ]排完序后[ 1 2 4 5 6 9 ]数组索引[ 0 1 2 3 4 5 ]第一部分 第...原创 2011-12-09 09:53:49 · 369 阅读 · 0 评论 -
经典排序算法(二十)--Strand Sort
Strand sort是思路是这样的,它首先需要一个空的数组用来存放最终的输出结果,给它取个名字叫"有序数组"然后每次遍历待排数组,得到一个"子有序数组",然后将"子有序数组"与"有序数组"合并排序重复上述操作直到待排数组为空结束看例子吧待排数组[ 6 2 4 1 5 9 ]第一趟遍历得到"子有序数组"[ 6 9],并将其归并排序到有序数组里待排数组[ 2 4 1 ...原创 2011-12-09 09:52:56 · 229 阅读 · 0 评论 -
经典排序算法(十九)--Flash Sort
FlashSort依然类似桶排,主要改进了对要使用的桶的预测,或者说,减少了无用桶的数量从而节省了空间,例如待排数字[ 6 2 4 1 5 9 100 ]桶排需要100个桶,而flash sort则由于可以预测桶则只需要7个桶即待排数组长度个桶,如何预测将要使用的桶有这么一个公式该排序有前置条件,需要知道待排数组的区间和待排数组的长度,例如已知待排数组[ 6 2 4 1 5 ...原创 2011-12-09 09:52:16 · 539 阅读 · 0 评论 -
经典排序算法(十八)--Proxmap Sort
这个排序是桶排序和基数排序的改进,理解了前两者,这个排序很容易理解先回忆下桶排序是怎么回事,它与桶的区别在于入桶规则,桶排序里是1入1号桶,2入2号桶这个排序把数字分区了,然后给出一个所谓的键,例如它规定0-9都入0号桶10-19都入1号桶,这样桶覆盖的范围将增大10倍,这在某种情况下是很有用的有了桶排的基础后,再看下边两张图就什么都明白了,不再分解过程了图1图2...原创 2011-12-09 09:51:39 · 222 阅读 · 0 评论 -
经典排序算法(十七)--计数排序Counting Sort
注意与基数排序区分,这是两个不同的排序计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶看下具体的过程,一共需要三个数组,分别是待排数组,票箱数组,和桶数组var unsorted = new int[] { 6, 2, 4, 1, 5, 9 }; //待排数组var ...原创 2011-12-09 09:50:26 · 225 阅读 · 0 评论 -
经典排序算法(十六)--珠排序Bead Sort
珠排序非常另类[地精也很另类],看完你就知道了,先介绍思路,再分解过程这是它的英文论文 http://www.cs.auckland.ac.nz/~jaru003/research/publications/journals/beadsort.pdf截图即从上边的论文里抓的屏先了解一个概念,不然不容易理解,一个数字3用3个1来表示一个数字9用9个1来表示,珠排序中的珠指的是每一个...原创 2011-12-09 09:48:30 · 653 阅读 · 0 评论 -
经典排序算法(十五)--耐心排序Patience Sorting
这个排序的关键在建桶和入桶规则上建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可举个例子,待排数组[6 4 5 1 8 7 2 3]第一步,取数字6出来,此时一个桶没有,根据建桶规则1新建桶,将把自己放进去,为了表述方便该桶命名为桶1或者1号桶第二步,取数字4出...原创 2011-12-09 09:46:16 · 630 阅读 · 0 评论 -
经典排序算法(十四)--梳排序Comb Sort
梳排序还是基于冒泡排序,与冒泡不同的是,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样这个固定距离是待排数组长度除以1.3得到近似值,下次则以上次得到的近似值再除以1.3,直到距离小至3时,以1递减不太好描述,还是看例子吧假设待数组[8 4 3 7 6 5 2 1]待排数组长度为8,而8÷1.3=6,则比较8和2,4和1,并做交换[8 4 3 7 6 5 2 1]...原创 2011-12-09 09:45:09 · 211 阅读 · 0 评论 -
经典排序算法(十三)--奇偶排序Odd-even Sort
又一个比较性质的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序举例吧,待排数组[6 2 4 1 5 9]第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比[6 2 4 1 5 9]交换后变成[2 6 1 4 5 9]第二次比较偶数列,即6和1比,5和5比[2 6 1 4 5 9]交换后变成[...原创 2011-12-09 09:44:25 · 299 阅读 · 0 评论 -
经典排序算法(十二)--地精排序Gnome Sort
号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止直接看它排序的过程,待排数组[6 2 4 1 5 9]先设计一个标识i=0然后从头开始判断,什么时候(i < 6)不成立,什么时候排序结束,所以,如何控制i的值是这个算法的关键例如待排数组:[6 2 4 1 5 9][0 1 2 3 4 5]看一下...原创 2011-12-09 09:30:12 · 273 阅读 · 0 评论 -
经典排序算法(十一)--堆排序Heap Sort
堆排序有点小复杂,分成三块第一块,什么是堆,什么是最大堆第二块,怎么将堆调整为最大堆,这部分是重点第三块,堆排序介绍第一块,什么是堆,什么是最大堆什么是堆这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元...原创 2011-12-09 09:28:31 · 183 阅读 · 0 评论 -
经典排序算法(十)--希尔排序Shell Sort
希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分,第一部分,希尔排序介绍第二部分,如何选取关键字,选取关键字是希尔排序的关键第一块希尔排序介绍准备待排数组[6 2 4 1 5 9]首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组:[6 1]一组[2 5]二组[4 9]三组看仔细啊,不是...原创 2011-12-09 09:26:20 · 186 阅读 · 0 评论 -
经典排序算法(九)--鸡尾酒排序Cocktail Sort
鸡尾酒排序基于冒泡排序,双向循环还是看例子吧,给定待排数组[2 3 4 5 1]第一趟过去时的每一步第一步迭代,2 < 3不换[2 3 4 5 1]第二步迭代,3 < 4不换[2 3 4 5 1]第三步迭代,4 < 5不换[2 3 4 5 1]第四步迭代,5 > 1交换[2 3 4 1 5]第一趟回来时的...原创 2011-12-09 09:24:58 · 195 阅读 · 0 评论 -
经典排序算法(八)--选择排序Selection Sort
顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完再简单点,对着一群数组说,你们谁最小出列,站到最后边然后继续对剩余的无序数组说,你们谁最小出列,站到最后边再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大举例先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9]...原创 2011-12-09 09:23:48 · 164 阅读 · 0 评论 -
经典排序算法(七)--冒泡排序Bubble Sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环)第一次两两比较6 > 2交换(内循环)交换前状态:| 6 | 2...原创 2011-12-09 09:22:57 · 230 阅读 · 0 评论 -
经典排序算法(六)--归并排序Merge Sort
原理,把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组举例无序数组[6 2 4 1 5 9]先看一下每个步骤下的状态,完了再看合并细节第一步 [6 2 4 1 5 9]原始状态第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍第三步 [1 2 4 6] [5 9]继续两组两...原创 2011-12-09 09:20:17 · 236 阅读 · 0 评论 -
经典排序算法(三)--插入排序Insertion Sort
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。 图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。代码public class InsertionSorter{ p...原创 2011-12-09 09:15:40 · 200 阅读 · 0 评论 -
经典排序算法(二)--桶排序Bucket Sort
补充说明三点1,桶排序是稳定的2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法我自己的理解哈,可能与网上说的有一些出入,大体都是同样的原理无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为[0-9](考试分数为1-100等)例如待排数字[6 2 4 1 5 9]准备10个空桶...原创 2011-12-09 09:12:24 · 442 阅读 · 0 评论 -
经典排序算法(一)--快速排序Quick Sort
原理,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列举个例子如无序数组[6 2 4 1 5 9]a),先把第一项[6]取出来,用[6]依次与其余项进行比较,如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到...原创 2011-12-09 09:10:49 · 199 阅读 · 0 评论