本周就不展示洛谷题单了,我们来看看排序问题,展示我PTA简单插入排序和直接插入排序两个题吧。
一.PTA 7-5 简化的插入排序
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
输入样例:
5
1 2 4 5 7
3
输出样例:
1 2 3 4 5 7
代码
#include<stdio.h>
int main()
{
int n,i,t,a[10],flag=1;//利用flag做一个判断标志
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&t);
for(i=0;i<n;i++)
{
if(t<=a[i]&&flag)//当flag等于0时不进行if的内容
{
printf("%d ",t);
flag=0;//这时相当于已插入了t,赋值flag=0
}
printf("%d ",a[i]);
}
if(t>=a[n-1])
printf("%d ",t);//此时t比数组中的所有元素都大,将t最后输出
return 0;
}
二.直接插入排序
插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小。本实例要求使用直接插入排序法将数字由小到大进行排序。
实现过程:
(1) 自定义一个函数,实现直接插入排序,在本实例中,我们自定义该函数为 insort()。
(2) main() 函数为程序的入口函数。程序代码如下:
#include <stdio.h>
int insort(int s[], int n) /* 自定义函数 insort()*/
{
int i,j;
for(i=2;i<=n;i++) //数组下标从2开始,s[0]做监视哨,s[1]一个数据无可比性
{
s[0]=s[i]; //给监视哨陚值
j=i-1; //确定要比较元素的最右边位黄
while(s[0]<s[j])
{
s[j+1]=s[j]; //数据右移
j--; //产移向左边一个未比较的数
}
s[j+1]=s[0]; //在确定的位置插入s[i]
}
return 0;
}
int main()
{
int a[11],i; //定义数组及变量为基木整甩
printf("请输入10个数据:\n");
for (i =1;i<=10;i++)
scanf("%d",&a[i]); //接收从键盘输入的10个数据到数组a中
printf("原始顺序:\n");
for(i=1;i<11;i++)
printf("%5d",a[i]); //将未排序前的顺序输出
insort(a,10); //调用自定义函数 insort()
printf("\n 插入数据排序后顺序:\n");
for(i=1;i<11;i++)
printf("%5d",a[i]); //将排序后的数组输出
printf("\n");
return 0;
}
本程序是对输入的十个整数进行直接插入排序,使用了监视哨是为了防止数据在后移时丢失。