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

直接插入排序

1.思想
每次将一个新数据插入到有序队列中的合适位置里。
这里写图片描述
2.代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int list[8]={9,0,6,7,1,5,4,8};
   int j = 0;
   /***********************************************************************/
      // 第1个数肯定是有序的,从第2个数开始遍历,依次插入有序序列  
     for (int i = 1; i < 8; i++) 
     {
        // 取出第i个数,和前i-1个数比较后,插入合适位置
         int temp = list[i]; 

        // 因为前i-1个数都是从小到大的有序序列,所以只要当前比较的数(list[j])比temp大,就把这个数后移一位
        for (j = i - 1; j >= 0 && temp < list[j]; j--)
        {
          list[j + 1] = list[j];
        }
        //插入值 
        list[j + 1] = temp;
  /***********************************************************************/    
          //输出 前i个排序后的结果 
         for(int k=0;k<=i;k++)
         {
            cout<<list[k]<<" ";
         }
         cout<<endl; 
     }   
}

这里写图片描述

3.性能
这里写图片描述

希尔排序

1.思想:
增量排序,希尔(Shell)排序又称为缩小增量排序,它是一种插入排序,把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
这里写图片描述
2.代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int list[8]={9,0,6,7,1,5,4,8};
  int length=sizeof(list)/sizeof(int); 
  int gap =length / 2;
  int j = 0;
    while (gap>=1) 
    {
        //把距离为 gap 的元素编为一个组,扫描所有组
        for (int i = gap; i < 8; i++) 
        {
            int temp = list[i];
            //对距离为 gap 的元素组进行直接插入排序
            for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) 
            {
                list[j + gap] = list[j];
            }
            list[j + gap] = temp;
        }

       /*****输出***********/ 
        cout<<"gap: "<<gap<<endl;
        for(int i=0;i<8;i++)
        {
          cout<<list[i]<<" ";
        }
        cout<<endl;
        /*******************/ 

        gap = gap / 2; // 减小增量
    }
}

这里写图片描述
3.性能分析

这里写图片描述

附加1:直接插入和希尔的比较:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/zhaoshuling1109/article/details/80582979
今日推荐