排序——插入排序
一、什么是插入排序
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
二、插入排序图解
三、插入排序代码实现
#include<iostream>//插入排序
using namespace std;
void f(int a[],int n){
for(int i=0;i<n-1;i++){
if(a[i]>a[i+1]){//如果相邻的两个不是从小到大排序,就进入下面步骤
int t=a[i+1];//由于在数组里,先将待插入的数字开辟一个空间另存下,一是腾出前面数字后移的空间,二是方便与前面排好序的数字比较
int j=i;//从已经排好序的尾端向前扫描
while(j>=0&&a[j]>t){//不断后移,直到插入数字大于某个数
a[j+1]=a[j];
j--;
}
a[j+1]=t;
}
}
}
void show(int a[],int n){
for(int i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
int main(){
int a[10]={9,5,3,7,4,8,6,4,2,1};
f(a,10);
show(a,10);
return 0;
}
四、结束语
在插入排序中,需要将取出的数据与其左边的数字进行比较。如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换数字的位置。
然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换数字,直到它到达整个序列的最左边为止。具体来说,就是第k轮需要比较k-1次。因此,在最糟糕的情况下,第2轮需要操作1次,第3轮操作2次……第n轮操作n-1次,所以时间复杂度和冒泡排序的一样,都为O(n2)。