插入排序、希尔排序

最后都变了- 提交于 2020-03-10 06:31:07

插入排序

基本思想:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

void InsertSort(vector<int>&v)
{
       for (int i = 1; i < v.size(); i++)
       {
              int k = v[i];
              int j;
              for ( j = i - 1; j >= 0; j--)
              {
                     if (k < v[j])
                            v[j + 1] = v[j];
                     else
                            break;
              }
              v[j + 1] = k;
       }
}

特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高。
  2. 平均时间复杂度:O(N^2)。
  3. 空间复杂度:O(1)。
  4. 稳定性:稳定。

希尔排序

基本思想:

把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

void ShellSort(vector<int>&v)
{
       int gap = v.size();
       while (1)
       {
              gap = (gap / 3) + 1;
              for (int i = gap; i < v.size(); i++)
              {
                     int k = v[i];
                     int j;
                     for (j = i - gap; j >= 0; j = j - gap)
                     {
                            if (k < v[j])
                                   v[j + gap] = v[j];
                            else
                                   break;
                     }
                     v[j + gap] = k;
              }
              if (gap == 1)
              {
                     break;
              }             
       }
}

特性总结:

  1. 希尔排序是对插入排序的优化。
  2. 当 gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。整体而言,可以达到优化的效果。
  3. 时间复杂度:O(N ^ 1.3 ~ N ^ 2)。
  4. 稳定性:不稳定
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!