插入排序

336 阅读2分钟

排序——插入排序

一、什么是插入排序

插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。

二、插入排序图解

src=http___upload-images.jianshu.io_upload_images_20052341-1fe073361b5b06c3.gif&refer=http___upload-images.jianshu.gif

三、插入排序代码实现

#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)。