第1关:编写函数将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
任务描述
本关任务:编写函数有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
测试说明
平台会对你编写的代码进行测试:
输入格式:
第一行先给出非负整数N;
第二行给出N个从小到大排好顺序的整数;
第三行给出一个要插入的整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
测试输入:
10
4 8 12 30 46 57 69 72 77 92
33
预期输出:
4 8 12 30 33 46 57 69 72 77 92
代码如下
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void input(int *&a,int &n);
void output(int *a,int n);
void Insert(int *a, int n, int temp);
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
scanf("%d",&m);
Insert(a, n, m) ;
output(a,n+1);
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a,int &n){
scanf("%d",&n);
a=(int *)malloc((n+1)*sizeof(int));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
}
void output(int *a,int n){
for(int i=0;i<n;i++)
printf("%d ",a[i]);
}
void Insert(int *a, int n, int temp){
int j;
for(j=n-1; j>=0 && temp<a[j]; j--) //查找插入位置
{
a[j+1]=a[j]; // 后移
}
a[j+1]=temp; // 插入数据到正确位置
}
/********** End **********/
第2关:直接插入排序
任务描述
本关任务:编写函数实现直接插入排序算法。
测试说明
平台会对你编写的代码进行测试,对数组中的元素实现直接插入排序,并输出每一次排序后的结果。具体请参见后续测试样例。
测试输入:
10
67 47 21 69 2 8 76 50 9 57
预期输出:
47 67 21 69 2 8 76 50 9 57
21 47 67 69 2 8 76 50 9 57
21 47 67 69 2 8 76 50 9 57
2 21 47 67 69 8 76 50 9 57
2 8 21 47 67 69 76 50 9 57
2 8 21 47 67 69 76 50 9 57
2 8 21 47 50 67 69 76 9 57
2 8 9 21 47 50 67 69 76 57
2 8 9 21 47 50 57 67 69 76
提示:
如果有10个整数,要求输出每趟插入排序共9趟的结果。
代码如下
#include <stdio.h>
#include<stdlib.h>
void input(int *&a,int & n);
void output(int *a,int n);
void InsertSort(int *a,int n);
int main ()
{
int i,n,m;
int *a = NULL;
input(a,n);
InsertSort(a,n);
free(a);
return 0;
}
void input(int *&a,int & n)
{
int i;
scanf("%d",&n);
if((a=(int *) malloc ((n)*sizeof(int)))==NULL)
{
printf("不能成功分配内存单元\n");
exit(0);
}
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void output(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int &a, int &b)
{
int t;
t=a;a=b;b=t;
}
/**********定义InsertSort()函数**********/
/********** Begin **********/
void InsertSort(int *a,int n){
int i,j;
for(i=1;i<n;i++){
if(a[i]<a[i-1]){
int temp=a[i];
for(j=i-1;j>=0&&temp<a[j];j--)
a[j+1]=a[j];
a[j+1]=temp;
}
output(a,n);
}
}
/********** End **********/
第3关:希尔排序
任务描述
本关要求实现希尔排序的功能。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入:
15
19 49 21 43 16 4 47 20 86 64 51 55 98 81 36
预期输出:
第1趟排序结果:
4 47 20 43 16 19 49 21 81 36 51 55 98 86 64
第2趟排序结果:
4 16 19 36 21 20 43 47 55 49 51 64 98 86 81
第3趟排序结果:
4 16 19 20 21 36 43 47 49 51 55 64 81 86 98
提示:
根据给定的增量序列是5,3,1,输出每趟排序结果。
代码如下
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void input(int *&a,int & n);
void output(int *a,int n);
void ShellInsert(int *L,int n,int dk);
void ShellSort(int *L,int n,int dlta[],int t);
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
int dlta[3]={5,3,1};
ShellSort (a, n, dlta, 3) ;
free(a);
return 0;
}
void input(int *&a,int & n)
{
int i;
scanf("%d",&n);
if((a=(int *) malloc ((n)*sizeof(int)))==NULL)
{
printf("不能成功分配内存单元\n");
exit(0);
}
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void output(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int &a, int &b)
{
int t;
t=a;a=b;b=t;
}
/**********定义ShellInsert() 和 ShellSort()函数**********/
/********** Begin **********/
void ShellInsert(int *L,int n,int dk){
int i,j;
for(i=dk;i<n;i++){
int temp=L[i];
for(j=i-dk;j>=0 && temp<L[j];j-=dk)
L[j+dk]=L[j];
L[j+dk]=temp;
}
}
void ShellSort(int *L,int n,int dlta[],int t){
for(int k=0;k<t;k++){
ShellInsert(L,n,dlta[k]);
printf("第%d趟排序结果:\n",k+1);
output(L,n);
}
}
/********** End **********/