您的位置:首页 > 运维架构 > Shell

排序算法思想——归并排序、堆排序、shell排序

2018-03-21 20:34 218 查看
1.归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
两个已经排序的序列合并成一个序列的操作
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序的基本思想
将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。
2.堆排序堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。要点:首先,按堆的定义将数组R[0..n]调整为堆(这个过程称为创建初始堆),交换R[0]和R
;然后,将R[0..n-1]调整为堆,交换R[0]和R[n-1];如此反复,直到交换了R[0]和R[1]为止。 以上思想可归纳为两个操作:(1)根据初始数组去构造初始堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大->即如果子节点比父节点大就不断交换,重复直到最后根节点最大)。(2)每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆。 当输出完最后一个元素后,这个数组已经是按照从小到大的顺序排列了。
3.shell排序
希尔排序也称为 “缩小增量排序”。它的基本原理是:首先将待排序的元素分成多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个待排序序列 “基本有序后”, 再对所有元素进行一次直接插入排序。希尔排序的示例: 



算法实现

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数 
即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
shellSort(int a[],int n)
{
int i,j,gap,tmp;
for(gap=n/2;gap>0;gap/=2)//步长逐次减半
{
for(i=gap;i<n;i++)//循环内为一次gap步长内的排序
{
tmp=a[i];
for(j=i-gap;(j>=0&&a[j]>tmp);j-=gap)//将a[gap]与之前的同组元素一起进行排序
a[j+gap]=a[j];
a[j+gap]=tmp;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐