算法思想:
以前面元素有序为基准,当前元素与已经排好的序列进行比较,找到对应该元素的位置将以排好的元素后移,插入当前元素
eg:
6
6 4 7 3 1 5
第一趟:6为已排好的序列, 4插入结果: 4 6 7 3 1 5
第二趟:4,6为已排好的序列,7插入结果: 4 6 7 3 1 5
第三趟:4,6,7为已排好的序列,3插入结果: 3 4 6 7 1 5
第四趟:3,4,6,7为已排好的序列,1插入结果: 1 3 4 6 7 5
第五趟:1,3,4,6,7为已排好的序列,,5插入结果: 1 3 4 5 6 7
#include<stdio.h>
void insertsort(int a[],int n)
{
for(int i=1; i<n; i++)
{
temp=a[i];
j=i-1;
while(j>=0 && a[j]>temp)
{
a[j+1]=a[j];///后移
j--;
}
a[j+1]=temp;
}
}
int main()
{
int a[100],n;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
insertsort(a,n);
for(int i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
插入排序例题
有两个递增数组,把第二个数组的数逐个插入到第一个数组中
使第一个数字组中所有数均不大于第二个数组
input:
4 12 28
1 7 9 29 45
output:
1 4 7
9 12 28 29 45
算法思想:
设第一个数组为a,第二个数组为b
判断a的最后一个元素是大于b的第一个元素(因为a,b递增)
不大于则交换并排序,因为有序只需进行依次直接插入排序即可
直到a最后一个元素大于b的第一个元素为止
#include<stdio.h>
void integrate(int a[],int b[],int n,int m)
{
int i,j;
while(a[n-1]>b[0])
{
int temp=b[0];
j=n-1;
b[0]=a[n-1];
a[n-1]=temp;
while(a[j-1]>temp && j>=0)
{
a[j]=a[j-1];
j--;
}
a[j+1]=temp;
j=0;
temp=b[0];
while(b[j+1]<temp && j<m)
{
b[j]=b[j+1];
j++;
}
b[j]=temp;
}
}
int main()
{
int a[100],b[100],n,m;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0; i<m; i++)
scanf("%d",&b[i]);
integrate(a,b,n,m);
for(int i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
for(int i=0; i<m; i++)
printf("%d ",b[i]);
printf("\n");
return 0;
}