把直接插入排序与希尔排序放在一块讲是因为希尔排序中涉及到了直接插入排序,且希尔排序是把很多个记录“模块化”处理的一种方式,然后再进行直接插入排序。
直接插入排序:
算法思想:就是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录增1的有序表
直接插入排序算法实现:
#include <stdio.h>
int insertSort(int *r,int length)
{
int i,j;
for(i=2;i<length;i++)
{
if(r[i]<r[i-1])
{
r[0]=r[i];//设置为哨兵
for(j=i-1;r[j]>r[0];j--)
r[j+1]=r[j];
r[j+1]=r[0];
}
}
return *r;
}
int main()
{
int r[6]={0,5,3,4,6,2};
int i;
for(i=1;i<6;i++)
{
printf("before insert sort: %d\n",r[i]);
}
insertSort(r,6);
for(i=1;i<6;i++)
{
printf("after insert sort: %d\n",r[i]);
}
}
直接插入排序算法说明:
问题:上述中有两个对r[j+1]的赋值,两个r[j+1]是否是同一个位置?有什么意义?
这个问题对于初学者而言都是个比较难理解的问题,对于第一个r[j+1]还好理解,但是对第二个就比较难理解了,其实这儿也不是很难理解,因为执行了一句语句以后,j--了,所以说第二r[j+1]相对于第一个j+1其实是提前了一个位置。
希尔排序:
弄清希尔排序之前我们还是先提出几个问题?
为什么要提出希尔排序这种算法?
希尔排序可以增加速率,其时间复杂度为:O(nlogn)
希尔排序是怎么操作的?
基本的思路来源于:将原本含有大量记录数的记录进行分组。分割成若干个子序列,此时相对而言每个子序列待排序的记录个数就比较少了。然后在这些子序列内分别进行直接插入操作,此时当整个序列都基本有序时,再对全体记录进行一次直接插入排序。
(我感觉还是不是很懂。。起码我是)
|
|
|
貌似上面有这么几步:得有子序列(怎么来?)------可以这样:将相距某个“增量”的记录组成一个子序列。这样在子序列内进行直接插入排序后额结果是基本有序的。
算法实现:
说明:首先引入了increment的变量-----就是那个增量(初始值:等于待排序的记录数)
其实希尔排序就是直接插入排序的一种,只不过希尔排序引入了增量的概念,这就造成了其排序的交换次序是一种“增量”的跨度排序。