1.“插入”的来源
所谓的“插入”,类似于我们玩扑克牌时候,将扑克牌插入到合适位置的过程。(除过J、Q、K、A)
2.算法思想
假定我们的牌只有1张时,认为该牌组的牌序是有序的。(5,1,4,2,3)
那么,我们就可以将我们的一组牌分为左右两组了,起始情况下:
1)左边牌组:5
2)右边牌组:1,4,2,3
好了,左边牌序根据我们的假设,它已经是有序的。
第一次插入,
我们从右边牌组中只取第一张牌(1)插入到左边牌组的合适位置。
1)左边牌组:1,5
2)右边牌组:4,2,3
第二次插入,
我们从右边牌组中依然只取第一张牌(4)插入到左边牌组的合适位置。
1)左边牌组:1,4,5
2)右边牌组:2,3
第三次插入,
我们从右边牌组中只取第一张牌(2)插入到左边牌组的合适位置。
1)左边牌组:1,2,4,5
2)右边牌组:3
第四次插入,
我们从右边牌组中依然只取第一张牌(3)插入到左边牌组的合适位置。
1)左边牌组:1,2,3,4,5
2)右边牌组:
3.核心代码
1) 每次只取右边牌组第一个数
a[0]=a[i]; //待插入点为a[0] ,假设a[1]是已经排好序的
2) 从后往前寻找合适点进行插入
for(j=i;j>1;j--){
if(a[j-1]<a[0]){
break;
}
a[j] = a[j-1];
}
3) 将待插点插入到合适点
a[j]=a[0]; //a[0]是待插点,a[j]是合适点
4.完整代码
#include <stdio.h>
#define N 100
void insert(int *a,int n){
int i,j;
for(i=2;i<=n;i++){
a[0]=a[i]; //待插入点为a[0] ,假设a[1]是已经排好序的
for(j=i;j>1;j--){
if(a[j-1]<a[0]){
break;
}
a[j] = a[j-1];
}
a[j]=a[0];
}
}
int main(void){
int n=5;
//scanf("%d",&n);
int a[N]={-1,5,3,1,2,4}; //a[0]是一个存放待插点的位置
insert(a,n);
int i=1;
for(;i<=n;i++){
printf("%-5d",a[i]);
}
return 0;
}
5.运行结果
1)左边牌组:1,5
2)右边牌组:4,2,3