时间复杂度
· 直接插入排序最好的时间复杂度为O(n)
· 直接插入排序的最坏时间复杂度为O(n^2)
· 因此直接插入排序总的平均时间复杂度为O(n^2)
注:具有稳定性
排序原理
虽然给出的排序数字为一个数组或者别的容器,但是排序的时候,就当是顺序给你一个又一个数字,给你一个你排一个(类似于扑克牌,打牌的时候,你拿一张牌,你要排一下顺序,看拿到的牌的大小,大的往后,小的直接插前面,但不同的是你拿到牌直接能看出来放哪,而在计算机里的排序,必须先比较,前面已经排好的数字,你才知道放哪),直接插入排序就是按这个思想来走的。
测试截图
要排序的数字为2,5,3,6,1,7
左边是排好的数字,右边是还没排的,从这个排序过程可以看出,运算过程是取一个排一个,
以第二遍为例,2,5已经排好,下一个要排的是3,所以第三遍,3先跟5比较,3<5,所以,3跟2在比较,3>2,因此3放2,5之间。
c++(从小往大排)
#include<iostream>
using namespace std;
void directsort(int a[6],int n){
int temp;
for(int i=1;i<n;i++){//不从0取是因为拿到第一个不用排,就像你不会拿第一张扑克就想排在哪里
/* 中间注释部分是上面截图的运行过程展示,与排序过程无关
cout<<"第"<<i<<"遍 ";
for(int k=0;k<i;k++){
cout<<a[k]<<" ";
}
cout<<" ";
for(int b=i;b<n;b++){
cout<<a[b]<<" ";
}
cout<<endl;
*/
if(a[i]<a[i-1]){ //如若拿到的数字比排好序中最大的数小,就像上例3<5
temp=a[i]; //把要排序数字赋值给临时变量
for(int j=i-1;j>=0&&a[j]>temp;j--){//这个过程相当于上例中,从5往前比较
a[j+1]=a[j];//把比要排序的数字大的都往后挪一位,给排序数字留出位置
, }
a[j+1]=temp;//循环结束,把排序数字放到留的位置上
}
}
}
void print(int a[6],int n){//
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int a[6]={2,5,3,6,1,7};
directsort(a,6);//排序
print(a,6);//输出排好序的数组
}