第1关:编写函数在一个数组中选择最小值
任务描述
本关任务:编写函数在一个数组一定范围内选择最小值。
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,完成三个函数的定义,具体要求如下:
- 函数
input()
实现一维数组的输入; - 函数
output()
实现一维数组的输出; - 函数
int SelectMinKey(int *L,int i,int n)
,函数返回值为数组L
在下标i
到n
范围内最小值的下标。
测试说明
平台会对你编写的代码进行测试, 输入格式: 第一行先给出非负整数N
; 第二行给出N
个整数;
输出格式: 第一行输出N
个整数; 以后每行输出数组不同范围内最小值的下标。
测试输入: 10
66 37 66 7 34 52 23 85 7 10
预期输出: 66 37 66 7 34 52 23 85 7 10
0,9,3
1,9,3
2,9,3
3,9,3
4,9,8
5,9,8
6,9,8
7,9,8
8,9,8
#include <stdio.h>
#include<stdlib.h>
#include<limits.h>
void input(int *&a,int & n);
void output(int *a,int n);
int SelectMinKey(int *L,int i,int n);
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
output(a,n);
for(i=0;i<n-1;i++)
{
printf("%d,%d,%d\n",i,n-1,SelectMinKey(a,i,n) );
}
free(a);
return 0;
}
/**********定义函数**********/
/********** Begin **********/
void input(int *&a, int &n) {
scanf("%d",&n);
a = (int *)malloc(sizeof(int) * n);
int i;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
n = i;
}
void output(int *a, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
int SelectMinKey(int *L, int i, int n) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (L[j] < L[minIndex]) {
minIndex = j;
}
}
return minIndex;
}
/********** End **********/
第2关:简单选择排序
本关要求通过定义函数void SelectSort(int *a,int n)
来实现简单选择排序的功能
#include <stdio.h>
#include<stdlib.h>
void input(int *&a,int & n);
void output(int *a,int n);
int SelectMinKey(int *L,int i,int n);
void SelectSort(int *L,int n);
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
SelectSort (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");
}
/**********定义函数**********/
/********** Begin **********/
int SelectMinKey(int *L,int i,int n)
{int MinIndex=i;
for(int j=i+1;j<n;j++)
{
if(L[j]<L[MinIndex])
MinIndex=j;
}
return MinIndex;
}
void SelectSort(int *L,int n)
{int temp=0;
for(int i=0;i<n-1;i++)
{
temp=L[SelectMinKey(L,i,n)];
L[SelectMinKey(L,i,n)]=L[i];
L[i]=temp;
output(L,n);
}
}
/********** End **********/
堆排序:
#include <stdio.h>
#include <stdlib.h> // 添加这一行
#include <time.h>
void input(int *&a,int & n);
void output(int *a,int n);
void HeapAdjust(int* a,int s,int m);
void HeapSort(int *a,int n);
int main ()
{
int i,n,m;
int *a = NULL;
input (a,n);
HeapSort (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;
}
/* 定义函数 */
void HeapAdjust(int* a,int s,int m) {
int i = s;
while(i * 2 + 1 <= m) {
int j = 2 * i + 1;
if(j + 1 <= m && a[j] < a[j + 1]) {
j++;
}
if(a[i] < a[j]) {
swap(a[i], a[j]);
i = j;
} else {
break;
}
}
}
void HeapSort(int *a,int n) {
int i;
for(i = n / 2 - 1; i >= 0; i--) {
HeapAdjust(a, i, n);
}
for(i = n - 1; i >= 0; i--) {
swap(a[0], a[i]);
HeapAdjust(a, 0, i);
}
}