直接插入排序
直接插入排序简称插入排序,对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入
到已经排好序的有序表中,从而得到一个新的、记录数增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)。另外,在数据量很大的时候,插入排序就不再适用了,它只适用于数据量较小的情况。