假如一个数组只有1个元素,那么这个数组就已经是有序的了;
假如这个数组有2个元素,那么就把a[1]当做是比较数temp,比较a[0],如果a[1]<a[0],那么就将a[0]右移一位(从小到大排序),接着在位置0插入temp;
假如这个数组有3个元素,那么就把a[2]当做是比较数temp,比较a[0],a[1],如果a[2]<a[1],那么就将a[1]右移一位(从小到大排序),如果a[0]<a[2],那么在位置0的前一个位置,即位置1插入temp;
假如这个数组有n个元素,那么就重复前面的步骤,直至比较数是a[n-1]
核心思想:每一次进行排序都是在已经排好序的表上进行的,从而得到新的排序表。即将无序的序列逐个插入到有序的序列中。
(比较数逐个左比,非比较数逐个右移)
优势:当要排列的序列是基本有序的情况下,或者是数组容量比较下的情况下,插入排序的优势比较大。
时间复杂度 O(n²) (尽管时间复杂度相同,但优于冒泡排序、简单选择排序)
#include"stdio.h"
void swap1(int a[],int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void swap2(int* a,int* b){
int temp = *a;
*a = *b;
*b = temp;
}
void print(int a[],int length){
for(int i=0;i<length;i++){
printf("%d ",a[i]);
}
putchar('\n');
}
void InsertSort(int arr[],int length){
int i,j;
for(i=1;i<length;i++){
if(arr[i]<arr[i-1]){
int temp = arr[i];
for(j=i-1;j>=0&&temp<arr[j];j--){
arr[j+1]=arr[j];
}
arr[j+1]= temp;
}
}
}
int main(){
int a[10] = {4,1,9,5,7,2,6,8,3,10};
InsertSort(a,10);
print(a,10);
return 0;
}