您的位置:首页 > 其它

插入排序(直接插入排序,希尔排序)

2017-07-11 13:30 951 查看
直接插入排序

          直接插入排序是把一组数据的第一个数看做有序(同时这个数是有序区的最后一个数end),拿要插入的数与end比较大小。(1)比end大,直接放在end的后面(2)比end小,把end这个数放在end的后一个位置,再把要插入的数与end的前一个数比较。



void InsertSort(int* a,int n)//1 直接插入排序
{
for (int i = 0; i <n-1; ++i)
{
int end = i ;
int tmp = a[i+1];
while(end>=0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
--end;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}


直接插入排序的时间复杂度:O(N^2).

最好情况(时间复杂度是O(N)):原序列接近于有序 

最坏情况(时间复杂度是O(N^2)):原序列接近于逆序

直接插入排序是一种稳定的排序算法。

希尔排序
      希尔排序是直接插入排序的优化,用gap值使得小的值能尽量排到前面,大的值能尽量排到后面。





void ScheerSort(int* a, int size,int gap)
{
while (gap > 1)
{
gap = gap / 3 + 1;
for (size_t i = 0; i < size - gap; ++i)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}

希尔排序的时间复杂度:O(N^1.3)[最好情况:O(N) 最坏情况:O(N^2)] 。希尔排序是不稳定的

总结:直接插入排序最好的情况恰恰是希尔排序最坏的情况。直接插入最坏的情况是希尔排序最好的情况。因为希尔排序能够把大的数尽量靠后,小的数尽量靠前。

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐