Description
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
Input
10个整数
Output
整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
Sample Input
2 1 3 4 5 6 7 8 10 9
Sample Output
1 2 3 4 5 6 7 8 9 10
Note:
关于 max != n-1 时后面的理解
比如,初始数组: 9 8 3 5,此时 max=0, min=2,当a[min] 和 a[0] 交换后,数组:3 8 9 5;此时 max=0 所指向并不是数组最大元素,反而 min=2 指向的才是最大元素,所以将 min 和 n-1 交换 swap(a, min, n-1)。
#include <stdio.h>
void Input(int a[], int n);
void Sort(int a[], int n);
void Output(int a[], int n);
int main()
{
int a[100];
Input(a, 10);
Sort(a, 10);
Output(a, 10);
return 0;
}
void Input(int a[], int n)
{
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
}
void Sort(int a[], int n)
{
int min, max, i, tmp;
min = max = 0;
for(i=1; i<n; i++)
{
if(a[i]< a[min])
min = i;
if(a[i] > a[max])
max = i;
}
if(min != 0)
{
tmp = a[0];
a[0] = a[min];
a[min] = tmp;
}
if(max != n-1)
{
if(max == 0) //最大值下标是 0,此时第一个元素已经和第min个元素互换
{
tmp = a[n-1];
a[n-1] = a[min];
a[min] = tmp;
}
else
{
tmp = a[n-1];
a[n-1] = a[max];
a[max] = tmp;
}
}
}
void Output(int a[], int n)
{
for(int i=0; i<n-1; i++)
printf("%d ", a[i]);
printf("%d", a[n-1]);
}
拓展:双向排序
排序思想:第一趟将最小元素与r[0] 互换,最大元素与r[n-1] 互换;第二趟将次小与 r[1] 互换,次大与 r[n-2] 互换 ... 直到待排为递增序。
#include <stdio.h>
void Input(int a[], int n);
void Sort(int a[], int n);
void Output(int a[], int n);
int main()
{
int a[100];
Input(a, 10);
Sort(a, 10);
Output(a, 10);
return 0;
}
void Input(int a[], int n)
{
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
}
void Sort(int a[], int n)
{
int min, max, i=0, j, tmp;
while(i < n-1-i)//双向排序,每趟固定两个元素。终止条件:2i >= n
{
min = max = i;//i 为每趟待排的第一个元素
for(j=i+1; j<n-i; j++)
{
if(a[j]< a[min])
min = j;
if(a[j] > a[max])
max = j;
}
if(min != i)
{
tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
if(max != n-1-i)
{
if(max == i) //最大值下标是 0,此时第一个元素已经和第min个元素互换
{
tmp = a[n-1-i];
a[n-1-i] = a[min];
a[min] = tmp;
}
else
{
tmp = a[n-1-i];
a[n-1-i] = a[max];
a[max] = tmp;
}
}
i++;
}
}
void Output(int a[], int n)
{
for(int i=0; i<n-1; i++)
printf("%d ", a[i]);
printf("%d", a[n-1]);
}