您的位置:首页 > 其它

插入排序——直接插入排序、二分插入排序、希尔排序

2018-01-24 21:56 531 查看
选择排序是一种较为简单的排序算法。它的实现原理是每一次从待排序的数据元素中挑出一个最小(大)的元素,存放在数据的起始(末尾)位置,直到所有待排序的数据排完。

直接插入排序:

当插入第i个元素的时候,我们认为它前面的i个元素已序。

这时候用array[i]的排序吗与前面的排序码进行比较,找到适合的位置就进行插入,原来位置上的元素按顺序向后移动。

 


 

时间复杂度:     最差:和所需要的序列相反 O(n^2)

                         最优:和所需要的系列相同 O(n)

空间复杂度:O(1)

稳定性:不稳定

代码如下:

void InsertSort(int *array, int size)
{
for (int i = 0; i<size; i++)
{
int key = array[i];
int end = i-1;
while (end >= 0 && key < array[end])   // key <= array[end]不稳定
{
array[end+1] = array[end];
end--;
}
array[end+1] = key;
}
}

二分插入排序:

在插入排序中,如果比较操作的代价大于数据交换的代价时,这时候二分查找的作用就很明显了。通过二分查找,我们可以减少比较操作的次数。

时间复杂度:   最差:O(N^2)

                       最优:n O(lgN)

空间复杂度:O(1)

稳定性:稳定

void binarysort(int *array, int size)
{
for (int i = 0; i < size; i++)
{
int left = array[0];
int right = array[size - 1];
int mid = 0;
int key = array[i];
while (left< right)
{
mid = left + (left + right) / 2;
if (key > array[mid])
left = mid+1;
else
right = mid+1;
}
for (int j = i - i; i >= left; j--)
{
array[j+1] = array[j];
array[left] = key;
}
}
}

当数据量较多的时候,二分插入排序可以很大程度上的减少数据的比较次数。但是当数据接近有序时,直接插入排序就要优于二分插入排序。

希尔排序:

希尔排序又叫“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。把所有数据按照一定的增量分组,分别对每组使用直接插入排序,随着增量的减少,每组包含的关键词越来越多。增量减为1时,排序结束。

希尔排序较之直接插入排序效率高在:直接插入排序每次只能移动一个数据,而希尔排序每次可以移动增量数个数据。排序的时间复杂度大幅度提高。

void shellsort(int *array, int size)
{
 int  gap = size;
 while (gap>1)
   {
    for (int i = 0; i<=size; i++)
     {
      gap = gap / 3 + 1;
      int key = array[i];
      int end = i + gap;
      while (end <= size-1 && key > array[end])
       {
         swap(key, array[end]);
         end = end + gap;
       }
      break;
     }
   }
}


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