【算法】直接插入排序

来源:互联网 发布:hyperion数据库重构 编辑:程序博客网 时间:2024/06/06 16:57

1.定义

每次从无序表中取出第一个元素
把它插入到有序表的合适位置,使有序表仍然有序
      
      

2.过程(说明定义)


初始序列: 48 ,37 , 64 , 96 , 75 , 12 ,26 , 48 , 54 , 03
第①趟 : [48] , 37 , 64 ,96 , 75 , 12 , 26 , 48 ,54 , 03
第②趟 : [37 , 48] , 64 , 96 , 75 ,12 , 26 , 48 , 54 , 03
第③趟 : [37 , 48 , 64] , 96 ,75 , 12 , 26 , 48 , 54 ,03
第④趟 : [37 , 48 , 64 , 96 ] , 75 , 12 ,26 , 48 , 54 , 03
第⑤趟 : [37 , 48 , 64, 75 , 96 ] , 12 ,26 , 48 , 54 , 03
第⑥趟 : [12 ,37 , 48 , 64 , 75 , 96 ] , 26 ,48 , 54 , 03
第⑦趟 : [12 , 26 , 37 , 48 , 64 , 75 , 96 ] , 48 ,54 , 03
第⑧趟 : [12 , 26 , 37 , 48 , 48 , 64 , 75 , 96 ] , 54 ,03
第⑨趟 : [12 , 26 , 37 , 48 , 48, 54 , 64, 75 , 96 ] , 03
第⑩趟 : [ 03 , 12 , 26 , 37 , 48 , 48, 54 , 64, 75 , 96 ]
      
      

3.代码-C/C++(实现过程)

#include<iostream>usingnamespace std;int main(){    int a[]={48,37,64,96,75,12,26,48,54,03};    int k=sizeof(a)/sizeof(a[0]);    int j;    for(int i=1;i<k;i++)//循环从第2个元素开始    {        if(a[i]<a[i-1])        {            int temp=a[i];            for(j=i-1;j>=0 &&a[j]>temp;j--)            {                a[j+1]=a[j];            }            a[j+1]=temp;//此处就是a }

      
      

4.理解(记忆代码)

❶ 确定有序区,让其不断变大
      用for循环实现,初值为1,终值为数组长度
❷ 如果有序区后的待排序数字小于有序区最后一个数字
       用if语句实现,具体数字位置用当前循环值确定
❸ 将当前待排序数字放入变量中
      设置temp变量,存放待排序数字
❹ 在有序区内找到第一个比待排序数字小的数字
       设置新的变量j,从后往前代表有序区的数字
       如果数字小于待排序数字,有序区数字向后移位
❺ 把待排序数字放在它的后面
      
      

5.算法分析


时间复杂度为最好情况为O(n),最坏为O(n²)
因为循环用了两次,所以最坏为O(n²),如果基本有序,比较次数很少的话,那就是O(n)
空间复杂度为O(1),因为用到了一个辅助变量
最后,这个一个稳定的算法

0 0
原创粉丝点击