本题要求实现一个函数,将整数数组中的最小值和最大值交换到下标最小和下标最大的位置。要求用最少的扫描趟数,最少的交换次数(数组内的数据交换,必须调用指定的数据交换函数以统计实际交换的次数)。 函数接口定义: void Maxmin(int d[],int n); 其中 d 和 n 分别表示数组的初址和数组的实际元素个数,n>0。 裁判测试程序样例: #include <stdio.h> #include <string.h> void output(int *d,int n);//数组显示函数,略去不表 void swap(int *d,int i,int j)//d[i]<-->d[j]//数组内的数据交换函数,交换最小最大值位置时必须调用 { d[i]^=d[j];d[j]^=d[i];d[i]^=d[j];} int CreatA(char *st,int *d);//这是根据字符串构造数组的函数,略去不表 void Maxmin(int d[],int n);//Min-->0,Max-->n-1 int main(){ int n,data[88];char st[250]; gets(st); n=CreatA(st,data); Maxmin(data,n);//Max->0;Min->n-1 output(data,n); printf("%d",num); return 0; } /* 请在这里填写答案 */
时间: 2024-03-24 19:39:52 浏览: 68
基于C++,写一个程序 要求用户输入10个数据到数组中,然后将数组中最大值和最小值显示出来,并显示下标
以下是本题的解题思路和代码实现:
首先考虑最少的扫描趟数,可以采用分治的思想,将数组分成左右两部分,分别求出左半部分的最小值和右半部分的最大值,然后再比较左半部分的最小值和右半部分的最大值,确定整个数组的最小值和最大值。可以使用递归实现,每次递归将数组分成两部分,直到只剩下一个元素,然后逐级向上返回最小值和最大值。
代码如下:
```
void Maxmin(int d[], int n) {
int min, max;
if (n == 1) {
min = max = d[0];
} else if (n == 2) {
if (d[0] < d[1]) {
min = d[0];
max = d[1];
} else {
min = d[1];
max = d[0];
}
} else {
int mid = n / 2;
int d1[50], d2[50];
memcpy(d1, d, mid * sizeof(int));
memcpy(d2, d + mid, (n - mid) * sizeof(int));
Maxmin(d1, mid);
Maxmin(d2, n - mid);
if (d1[0] < d2[n - mid - 1]) {
min = d1[0];
max = d2[n - mid - 1];
} else {
min = d2[n - mid - 1];
max = d1[0];
}
for (int i = 1; i < mid; i++) {
if (d1[i] < min) {
min = d1[i];
}
}
for (int i = mid; i < n; i++) {
if (d[i] > max) {
max = d[i];
}
}
}
int i = 0, j = n - 1;
while (i < j && d[i] != min) {
i++;
}
while (i < j && d[j] != max) {
j--;
}
if (i < j) {
swap(d, i, j);
num++;
}
}
```
其中,n为数组元素个数,d为数组指针,swap为交换函数,num为记录交换次数的全局变量。在递归结束后,得到数组的最小值和最大值,然后再遍历一遍数组,找到最小值和最大值所在的位置,交换它们即可。
阅读全文