直接插入排序

     直接插入排序简称插入排序,对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入

到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。在其实现过程中使用双层循环,外层循环对除了第一个元素之外的所有元素,

内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。下面通过一个例子来形象的介绍一下插入排序的原理。

    在我们打牌的时候,起初我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一

张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

    下面上一张图来展示一下

    接下来用代码展示一下

 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void insertsort(int a[],int n)  //插入排序;升序排列
 5 {
 6       bool flag;
 7       int i,j,tem=0;
 8       for(i=1;i<n;i++) //刚开始有序表中只有a[0],i指向待插入的序列
 9       {
10           tem=a[i];
11           flag=false;  //设置哨兵,用来标记是否找到了插入位置,初始假设没找到
12           for(j=i-1;j>=0;j--)  //查找待插入位置,j指向有序表中最后一个元素
13           {
14               if(a[j]>tem)
15               {
16                  a[j+1]=a[j];
17                  flag=true;   //找到待插入位置了,继续再找
18               }
19               else   //此时有序表中j所指的数不大于待插入元素,结束查找
20                   break;
21           }
22           if(flag==true) //找到待插入位置了,可以插入
23               a[j+1]=tem;  
24           cout<<""<<i<<"次待插入的数据是:"<<tem<<endl;
25           cout<<"此时有序表中的数据位:";
26           for(j=0;j<=i;j++)
27               cout<<a[j]<<" ";
28           cout<<endl;
29           
30       }
31 }
32 int main()
33 {
34     int a[10]={34,4,78,35,3,64,45,18,26,35};
35     insertsort(a,10);
36     cout<<"执行插入排序后数组为:";
37     for(int i=0;i<10;i++)
38         cout<<a[i]<<" ";
39     return 0;
40 }

写的比较详细,测试结果如下:

 

下面说一下时间复杂度和空间复杂度:

空间复杂度:由于排序过程中只用到了一个辅助空间,所以为空间复杂度位为 O(1)

时间复杂度:在进行排列时,最好的情况是序列已经是有序(升序或降序)的了,比较次数为(n-1)次;最坏的情况为序列是反有序(降序或升序),比较次数(n-1)*n/2,

基本操作执行(n-1)*n/2 + (n-1)次。所以算法平均的时间复杂度为O(n2)。另外,在数据量很大的时候,插入排序就不再适用了,它只适用于数据量较小的情况。

 

posted @ 2020-04-30 17:16  和运气碰碰  阅读(312)  评论(0编辑  收藏  举报