插入排序的思想便是“逐个比较”。
1 文字表述:
1)设置一个循环,从第二个数字开始(索引为1)不断与前面的数字相比。
2)每次循环开始时作为比较的数的索引为j,设置temp为其值。(因为比如将”8“赋值到”7“的位置时,如果不将”7“保存起来,那么便丢失了这个数字。)
3)取得j的前一位i。
4)只要i仍在数组中,并且索引为i处的值大于temp,就将i后一位的值设为i处的值,同时将i减1。
5)在i不在数组中或i处的值不必temp大时结束第四部的循环,然后将i后一位的值设置为temp。
2 伪码表示:
INSERTION-SORT(A)
for j = 2 to A.length // 代价c1,次数n
temp=A[j]; // 代价c2,次数n-1
// 将A[j]插入到已排序的A[1..j-1] // 代价0,次数n-1
i=j-1; // 代价c4,次数n-1
while i>0 and A[i]>temp // 代价c5
A[i+1]=A[i]; // 代价c6
i=i-1; // 代价c7
A[i+1]=temp; // 代价c8,次数n-1
3 算法实现:
#include<stdio.h>
void insort(int a[],int n);
int main(){
int array[5],num;
printf("数组长度:\n");
scanf("%d",&num);
printf("pls input\n");
for(int i=0;i<num;i++){
scanf("%d",&array[i]);}
insort(array,num);
for(int i=0;i<num;i++)
printf("%d",array[i]);
return 0;
}
void insort(int a[],int n){
for(int j=1;j<n;j++){
int key=a[j];
int i=j-1;
while(i>0&&a[i]>key){
a[i+1]=a[i];
i=i-1;
}
a[i+1]=key;
}
}