直接插入排序

    xiaoxiao2022-07-13  170

    直接插入排序(Straight Insertion Sort)的核心思想是:从只包含1个元素的有序序列开始,不断地将待排序数据元素有序的插入到这个有序序列合适的位置中,直到有序列表包含了所有待排序数据元素为止 。

    例子: 对于   3,1,5,7,2,4,9,6

    0.初始状态 3,1,5,7,2,4,9,6(共8个数)

         有序表:3;无序表:1,5,7,2,4,9,6

      1.第一次循环,从无序表中取出第一个数 1,把它插入到有序表中,使新的数列依旧有序

         有序表:1,3;无序表:5,7,2,4,9,6

      2.第二次循环,从无序表中取出第一个数 5,把它插入到有序表中,使新的数列依旧有序

         有序表:1,3,5;无序表:7,2,4,9,6

      3.第三次循环,从无序表中取出第一个数 7,把它插入到有序表中,使新的数列依旧有序

         有序表:1,3,5,7;无序表:2,4,9,6

      4.第四次循环,从无序表中取出第一个数 2,把它插入到有序表中,使新的数列依旧有序

         有序表:1,2,3,5,7;无序表:4,9,6

      5.第五次循环,从无序表中取出第一个数 4,把它插入到有序表中,使新的数列依旧有序

         有序表:1,2,3,4,5,7;无序表:9,6

      6.第六次循环,从无序表中取出第一个数 9,把它插入到有序表中,使新的数列依旧有序

         有序表:1,2,3,4,5,7,9;无序表:6

      7.第七次循环,从无序表中取出第一个数 6,把它插入到有序表中,使新的数列依旧有序

         有序表:1,2,3,4,5,6,7,9;无序表:(空)

     

    直接插入排序是稳定的,算法时间复杂度平均、最坏都是O(n²)  ,最好O(n),空间复杂度都是O(1);  

    #include<iostream> #include<cstdlib> #include<cmath> #include<cstdio> using namespace std; const int maxn =100001; int a[maxn]; void InsertSort(int a[],int N) { int i,j; for(i=1;i<N;i++) { int temp=a[i]; for(j=i-1;j>=0&&temp<a[j];j--) a[j+1]=a[j]; //将较大元素后移 a[j+1]=temp; //temp插入正确的位置 } } int main() { int n; cout<<"输入序列长度:"<<endl; cin>>n; cout<<"输入序列元素:"<<endl; for(int i=0;i<n;i++) cin>>a[i]; InsertSort(a,n); cout<<"输出序列元素:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; return 0; }

    运行结果: 

     

    最新回复(0)