shell排序:
希尔排序Shell Sort是基于插入排序的一种改进。
直接插入排序:设有一组关键字{ K 1 , K 2 ,…, K n };排序开始就认为 K 1 是一个有序序列;让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K 3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 K n 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。稳定的排序,总时间复杂度为O(n2)。
折半排序:当直接插入排序进行到某一趟时,对于 r[i].key 来讲,前边 i-1 个记录已经按关键字有序。此时不用直接插入排序的方法,而改为折半查找,找出 r[i].key 应插的位置,然后插入。这种方法就是折半插入排序( Binary insertion sort )。折半插入排序方法是稳定的,时间复杂度为O (n2 ) 。
shell排序:提出的“缩小增量”的排序方法。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。算法是不稳定的,算法时间复杂度时间复杂长为 O(n 1.3 )。
①先取一个正整数 d1(d 1 <;n) ,把全部记录分成 d1个组,所有距离为 d1的倍数的记录看成一组,然后在各组内进行插入排序;
②然后取 d2( d2 < d1 ) ;
③重复上述分组和排序操作;直到取 di=1(i>=1) ,即所有记录成为一个组为止。一般选 d1约为 n/2 , d2为 d 1 /2 , d3为 d 2 /2 ,…, d i =1 。
堆排序: 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法
首先说明两个概念:最大堆、最小堆。
堆的定义是:n个元素的序列{k1,k2,…,kn},当且仅当满足如下关系时被成为堆
(1)Ki <= k2i 且 ki <= k2i+1
或 (2) Ki >= k2i 且 ki >= k2i+1
(i = 1,2,…[n/2])
当满足(1)时,为最小堆(升序排列); 当满足(2)时,为最大堆(降序排列)。
堆排序的意义在意最快的找到最值,在堆结构中插入一个新的值或者取走最值后剩余的元素重新构成新的堆结构,其时间复杂度为O(logN),其他
的算法最少为O(N);因此堆排序在实践的用途更主要在调度算法中,例如:优先级的调度(每次取得最高的优先级)、时间驱动(每次取得最小或者最大的等
待时间)等等。
代码参考: http://www.cnblogs.com/MOBIN/p/5374217.html
----------------------------
参考:
http://blog.chinaunix.net/uid-21411227-id-1826847.html