第1关:编写函数将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

  • 任务描述
  • 相关知识
  • 编程要求
  • 测试说明

任务描述

本关任务:编写函数有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

相关知识

为了完成本关任务,你需要掌握在长度为n的有序数组a中插入一个整数x后数组a仍然有序的算法思想:

  1. 从数组最后一个元素起,将要插入的数据x与数组a最后一个元素a[n-1]比较,如果小,就把a[n-1]向后移动一位到a[n]中;如果大,就跳出循环;
  2. 再依次与a[n-2]比较,如果小,就把a[n-2]向后移动一位到a[n-1]中;如果大,就跳出循环;直到a[0]为止;
  3. 跳出循环后,将x插入到数组下标j+1处。
  4. for( j=n-1; j>=0 && x<a[j]; j-- ) //查找插入位置
  5. {
  6. a[j+1]=a[j] ; // 后移
  7. }
  8. a[j+1]=x; // 插入数据到正确位置

编程要求

本关要求通过定义函数来实现在长度为n的有序数组a中插入一个整数x后数组a仍然有序的功能。

  1. - void input(int *&a,int & n);//根据输入的n,动态申请长度为n+1的数组,存储输入的n个整数
  2. - void output(int *a,int n);//输出长度为n的数组元素的值
  3. - 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 **********/