第1关:编写函数将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:编写函数有n
(n<=100
)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m
,请将该数插入到序列中,并使新的序列仍然有序。
相关知识
为了完成本关任务,你需要掌握在长度为n
的有序数组a
中插入一个整数x
后数组a
仍然有序的算法思想:
- 从数组最后一个元素起,将要插入的数据
x
与数组a
最后一个元素a[n-1]
比较,如果小,就把a[n-1]
向后移动一位到a[n]
中;如果大,就跳出循环; - 再依次与
a[n-2]
比较,如果小,就把a[n-2]
向后移动一位到a[n-1]
中;如果大,就跳出循环;直到a[0]
为止; - 跳出循环后,将
x
插入到数组下标j+1
处。 for( j=n-1; j>=0 && x<a[j]; j-- ) //查找插入位置
{
a[j+1]=a[j] ; // 后移
}
a[j+1]=x; // 插入数据到正确位置
编程要求
本关要求通过定义函数来实现在长度为n
的有序数组a
中插入一个整数x
后数组a
仍然有序的功能。
- void input(int *&a,int & n);//根据输入的n,动态申请长度为n+1的数组,存储输入的n个整数
- void output(int *a,int n);//输出长度为n的数组元素的值
- void Insert(int *a, int n, int temp) ;
测试说明
平台会对你编写的代码进行测试:
输入格式: 第一行先给出非负整数
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 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;
}
void output(int *a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
/********** End **********/
第2关:直接插入排序
- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关任务:编写函数实现直接插入排序算法。
相关知识
直接插入排序,是指将无序序列中的各元素依次插入到已经有序的序列中。
假设数组中前i-1
元素已经有序,现在要将数组中第i
个元素插入到前面的有序数组中,插入过程如下:
以长度为n=8
的序列(13,6,1,31,9,27,5,11)
的插入排序过程做示范: 第1趟:将数组第2
个元素6
向前插入后,则数组中元素为(6,13,1,31,9,27,5,11)
; 第2趟:将数组第3
个元素1
向前插入后,则数组中元素为(1,6,13,31,9,27,5,11)
; 第3趟:将数组第4
个元素31
向前插入后,则数组中元素为(1,6,13,31,9,27,5,11)
; …… 第7趟:将数组第8
个元素11
向前插入后,则数组中元素为(1,5,6,9,11,13,27,31)
; 总之,共执行7
趟操作,可将有n=8
个元素的数组排成有序序列。
编程要求
根据提示,在右侧编辑器补充代码,定义函数来实现直接插入排序的功能,并输出每趟插入排序的结果。
- 定义函数
void InsertSort(int *a,int n);
来实现直接插入排序的功能
测试说明
平台会对你编写的代码进行测试,对数组中的元素实现直接插入排序,并输出每一次排序后的结果。具体请参见后续测试样例。
测试输入: 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,t;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])
{
t=a[i];
for(j=i-1;j>=0&&t<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=t;
}
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
}
/********** End **********/
第3关:希尔排序
- 任务描述
- 相关知识
- 编程要求
- 测试说明
任务描述
本关要求实现希尔排序的功能。
相关知识
希尔排序基本思想: 将整个无序序列分割成若干小的子序列分别进行插入排序。 子序列的分割方法如下: 将相隔某个增量dk
的元素构成一个子序列。在排序过程中,逐次减小这个增量,最后当dk
减到1时,进行一次插入排序,排序就完成。增量序列一般取dk=n/2k(k=1,2,……,logn)
,其中n
为待排序序列的长度。 其效率与增量序列有关。 在最坏情况下,需要的比较次数为O(n^1.50)
。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,完成函数的定义,实现希尔排序,具体要求如下:
- 函数 ShellInsert()实现一趟增量是dk的插入排序;
- 函数 ShellSort()实现数组希尔排序。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入: 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)
{
for(int i=dk;i<n;i++)
{
int temp=L[i];
int j=i-dk;
while(j>=0&&L[j]>temp)
{
L[j+dk]=L[j];
j-=dk;
}
L[j+dk]=temp;
}
}
void ShellSort(int *L,int n,int dlta[],int t)
{
for(int i=0;i<t;i++)
{
ShellInsert(L,n,dlta[i]);
printf("第%d趟排序结果:\n",i+1);
output(L,n);
}
}
/********** End **********/