插入排序——直接插入和希尔

来源:互联网 发布:戒色吧为什么不封 知乎 编辑:程序博客网 时间:2024/06/11 00:21

插入排序主要包括 直接插入和希尔排序


直接插入排序: 稳定,时间复杂度O(n^2)

从第二个元素开始,将后面的数据依次插入到前面有序的队列中

void derectinsert(int data[], int len)
{
int i =1; 
for(; i < len; i++)
{
  int value = data[i];
  int j=i-1;
  while(j >= 0 && value < data[j])
  {
    data[j+1] = data[j];
    j--;
  }
  data[j+1] = value;
}
}

以上算法也可以在最前面插入一个哨兵,让他的值等于value,这样就可以不用判断 j>=0了;另外,因为前面的数据已经是有序的了,所以在插入的时候可以采用折半查找,这样可以提高速度,为O(n*logn)


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2,一般认为是O(n^1.3)

它的算法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
    ①先取一个正整数 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 。

void shellsort(int data[], int len)
{
int d = len/2;
while(d>0)
{
    int k = 0;
    for(; k < d; k++)
{
int i = k+d;
for(; i < len; i+=d)
{
 int value = data[i];
 int j=i-d;
 while(j >= 0 && value < data[j])
 {
data[j+d] = data[j];
j-=d;
 }
 data[j+d] = value;
}
}

d = d/2;
}

注:当 d = 1的时候就是一个直接插入排序

原创粉丝点击