摘要:
经典排序算法 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教大多数排序算法都给出了每一步的状态,以方便初学者更容易理解,通俗易懂,部分难以理解的排序算法则给出了大量的图示,也算是一个特色吧经典排序算法 - 快速排序Quick sort经典排序算法 - 桶排序Bucket sort经典排序算法 - 插入排序Insertion sort经典排序算法 - 基数排序Radix sort经典排序算法 - 鸽巢排序Pigeonhole sort经典排序算法 - 归并排序Merge sort经典排序算法 - 冒泡排序Bu 阅读全文
摘要:
经典排序算法 - 计数排序Counting sort 注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 看下具体的过程,一共需要三个数组,分别是待排数组,票箱数组,和桶数组 var unsorted = new int[] { 6, 2, ... 阅读全文
摘要:
经典排序算法 - 珠排序Bead Sort 珠排序非常另类[地精也很另类],看完你就知道了,先介绍思路,再分解过程 这是它的英文论文 http://www.cs.auckland.ac.nz/~jaru003/research/publications/journals/beadsort.pdf 截图即从上边的论文里抓的屏 先了解一个概念,不然不容易理解,一个数字3用3个1来表示 一个数... 阅读全文
摘要:
经典排序算法 - 耐心排序Patience Sorting 这个排序的关键在建桶和入桶规则上 建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶 入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可 举个例子,待排数组[6 4 5 1 8 7 2 3] 第一步,取数字6出来,此时一个桶没有,根据建桶规则1新建桶,将把自己放进去... 阅读全文
摘要:
经典排序算法 - 梳排序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,并做交... 阅读全文
摘要:
经典排序算法 - 奇偶排序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和... 阅读全文
摘要:
经典排序算法 - 地精排序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]看一下具体的排序过程[ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较交换前[6 2 4 1 5 9][ i = 0]交换后[6 2 4 1 5 9][ i = 1][ i = 阅读全文
摘要:
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。 堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,... 阅读全文
摘要:
经典排序算法 - 希尔排序Shell sort希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分,第一部分,希尔排序介绍第二部分,如何选取关键字,选取关键字是希尔排序的关键第一块希尔排序介绍准备待排数组[6 2 4 1 5 9]首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组:[6 1]一组[2 5]二组[4 9]三组看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组,就是每隔3个数取一个,每隔三个再取一个,这样取出来的数字放到一组,把它们当成一组,但不实际分组,只是当成一组来看,所以上边的&q 阅读全文
摘要:
经典排序算法 - 鸡尾酒排序Cocktail sort鸡尾酒排序基于冒泡排序,双向循环还是看例子吧,给定待排数组[2 3 4 5 1]第一趟过去时的每一步第一步迭代,2 1交换[2 3 4 1 5]第一趟回来时的第一步,鸡尾酒一次到头后就回返回来,再到头后再过去,来回比,一个来回能排两个数字第五步迭代,1 1交换[1 2 3 4 5]排序完毕,顺序输出结果即可得[ 1 2 3 4 5]如何判断排序结束了?假如一趟来回没有交换任何数字,则表示该数组已经有序了,可以设置了个变量表示有没有交换过代码仅供参考 static void cocktail_sort(int[] unsor... 阅读全文
摘要:
经典排序算法 - 选择排序Selection sort顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完再简单点,对着一群数组说,你们谁最小出列,站到最后边然后继续对剩余的无序数组说,你们谁最小出列,站到最后边再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大举例先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9]第一趟找到最小数1,放到最前边(与首位数字交换)交换前:| 6 | 2 | 4 | 1 | 5 | 9 |交换后:| 1 | 2 | 4 | 6 | 5 | 9 |第二趟找 阅读全文
摘要:
经典排序算法 - 冒泡排序Bubble sort原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环)第一次两两比较6 > 2交换(内循环)交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |第二次两两比较,6 > 4交换交换前状态| 2 | 6 | 4 | 1 | 5 | 9 阅读全文
摘要:
经典排序算法 - 归并排序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]继续两组两组合并第四步 [1 2 4 5 6 9]合并完毕,排序完毕输出结果[1 2 4 5 6 9]合并细节详细介绍第二步到第三步的过程,其余类似第二步:[2 6] [1 4] [5 9]两两 阅读全文
摘要:
经典排序算法 - 基数排序Radix sort原理类似桶排序,这里总是需要10个桶,多次使用首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数例如待排序数组[62,14,59,88,16]简单点五个数字分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样| 0 | 0 | 62 | 0 | 14 | 0 | 16 | 0 | 88 | 59 || 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |桶编号将桶里的数字顺序取出来,输出结果:[62,14,16,88,59]再次入桶,不过这次以十位数的数字为准,进入相应 阅读全文
摘要:
经典排序算法 - 鸽巢排序Pigeonhole sort原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了]鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序例如var pigeonHole = new int[100];pigeonHole[0]的值表示0的出现次数...pigeonHole[1]的值表示1的出现次数...pigeonHole[2]的值表示2的出现次数...参考http://hi.baidu.com/wangxvfeng101/blog/item/a2c22560e57260c58cb10d8c.ht 阅读全文
摘要:
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。 图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。以下代码仅供参考,欢迎指正 /// /// 插入排序 /// /// static void insertion_sort(int[] unsorted) ... 阅读全文
摘要:
经典排序算法 - 桶排序Bucket sort补充说明三点1,桶排序是稳定的2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法我自己的理解哈,可能与网上说的有一些出入,大体都是同样的原理无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为[0-9](考试分数为1-100等)例如待排数字[6 2 4 1 5 9]准备10个空桶,最大数个空桶[6 2 4 1 5 9] 待排数组[0 0 0 0 0 0 0 0 0 0] 空桶[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)1,顺序从待排数组中取 阅读全文
摘要:
经典排序算法 - 快速排序Quick sort原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列举个例子如无序数组[6 2 4 1 5 9]a),先把第一项[6]取出来,用[6]依次与其余项进行比较,如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,//6出列后大喝一声,比我小的站前边,比我大的站后边,行动吧!霸气十足~一趟排完后变成下边这样:排序前 6 阅读全文