本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
分析:
- 输入一个整数 n,表示待排序数组的长度。
- 定义一个名为 s 的数组,长度为 n,并使用循环从用户处获取 n 个整数作为待排序的元素。
- 初始化两个变量 min 和 max,分别设置为 10000 和 -10000,用来记录数组中的最小值和最大值。
- 初始化两个变量 t 和 q,用来交换数组元素。
- 初始化两个变量 mark1 和 mark2,用来记录最小值和最大值的位置。
- 遍历整个数组,找到最大值和其对应的位置,同时更新 mark2 的值。
- 遍历整个数组,找到最小值和其对应的位置,同时更新 mark1 的值。
- 根据最大值和最小值的位置,选择一个基准元素(这里是 s[0]),与另一个元素进行交换(这里是 s[mark1] 或 s[mark2])。
- 根据交换后的元素位置,更新 t 和 q 的值,然后交换 s[n-1] 和 s[mark1] 或 s[mark2]。
- 最后,使用循环打印出排序后的数组。
代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int s[n];
for(int o=0;o<n;o++)
{
scanf("%d",&s[o]);
}
int min=10000,max=-10000;
int t=0,q=0;
int mark1=0;
int mark2=0;
for(int i=0;i<n;i++)
{
if(s[i]>=max)
{
max=s[i];
mark2=i;
}
}
for(int i=0;i<n;i++)
{
if(s[i]<=min)
{
min=s[i];
mark1=i;
}
}
if(s[0]>=s[mark2])
{
t=s[mark1];
s[mark1]=s[0];
s[0]=t;
q=s[mark1];
s[mark1]=s[n-1];
s[n-1]=q;
}
else
{
t=s[mark1];
s[mark1]=s[0];
s[0]=t;
q=s[mark2];
s[mark2]=s[n-1];
s[n-1]=q;
}
for(int o=0;o<n;o++)
{
printf("%d ",s[o]);
}
return 0;
}
总结:
快速排序的基本思想是:通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。