一、 问题描述
二、算法思想
使用分治法,可以将数组递归地分割成两部分,直到数组长度为1或2。然后比较这两部分的最大、次大、次小、最小数,最终得到整个数组中的最大两个数和最小两个数。
算法步骤如下:
- 定义一个函数
findMinMax(arr, start, end)
,用于在数组arr
的下标范围[start, end]
中寻找最大、次大、次小、最小数。- 当
start
和end
相等时,表示数组长度为1,直接返回这个数作为最大、次大、次小、最小数。- 当
end
比start
大1时,表示数组长度为2,比较这两个数的大小,返回较大的作为最大、次大数,较小的作为最小、次小数。- 否则,将数组分成两等分,分别递归调用
findMinMax
函数,将得到的最大、次大、次小、最小数保存为max1, max2, min1, min2
。- 比较
max1
和max2
,较大的数为当前数组的最大数,较小的数为次大数。- 比较
min1
和min2
,较小的数为当前数组的最小数,较大的数为次小数。- 返回最大、次大、次小、最小四个数。
三、代码实现
#include <stdio.h>
void quicksort(int a[],int left,int right)
{
if(left >= right) {
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j) {
while(i < j && key <= a[j]) {
j--;
}
a[i]= a[j];
while(i < j && key >= a[i]) {
i++;
}
a[j]= a[i];
}
a[i]= key;
quicksort(a,left,i- 1);
quicksort(a,i+1,right);
}
int main()
{
int i,N;
scanf("%d",&N);
int num[N];
for(i = 0; i < N; i++) {
scanf("%d",&num[i]);
}
quicksort(num,0,N-1);
printf("%-4d %-4d %-4d %-4d",num[N-1],num[N-2],num[1],num[0]);
return 0;
}
执行结果
结语
要战胜别人
首先要战胜自己
!!!