📅  最后修改于: 2023-12-03 15:30:15.231000             🧑  作者: Mango
给定一个长度为N(2<=N<=1000)的整数数组,要求把其中所有小于等于某个给定整数M的数都挑出来,按照从小到大的顺序排序输出。
本题要求对一个整数数组进行排序,我们可以使用经典的快速排序算法来完成。快速排序的思想是选取一个基准元素,把小于基准元素的数放在它的左边,大于基准元素的数放在它的右边,然后递归地进行对左右子序列的分治排序。为了实现挑出小于等于M的数并排序输出,我们需要在快速排序的过程中加入判断条件,将小于等于M的数视为小于基准元素,大于M的数视为大于基准元素。
在实现快速排序前,我们需要先定义一个函数来把小于等于M的数挑出来并组成一个新的数组,然后再对新数组进行快速排序。下面是一个实现该功能的函数:
void pick(int a[], int n, int m, int b[], int *len){
int i, j;
for(i = 0, j = 0; i < n; i++){
if(a[i] <= m){
b[j++] = a[i];
}
}
*len = j;
}
该函数接受一个长度为n的整数数组a,一个整数m,以及一个空数组b和一个指向b数组长度的指针len。该函数遍历整个数组a,如果某个元素小于等于m,则将其存入数组b中,并把已存入元素数目加1,最后返回b数组的长度。
有了选取小于等于M的数的函数,我们就可以结合快速排序进行解题。下面是一个实现的样例代码:
#include<stdio.h>
#include<stdlib.h>
void pick(int a[], int n, int m, int b[], int *len){
int i, j;
for(i = 0, j = 0; i < n; i++){
if(a[i] <= m){
b[j++] = a[i];
}
}
*len = j;
}
void quick_sort(int a[], int l, int r){
if(l >= r) return;
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while(i < j){
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
int b[1000], len;
pick(a, r - l + 1, x, b, &len);
quick_sort(b, 0, len - 1);
for(i = 0; i < len; i++){
a[i + l] = b[i];
}
quick_sort(a, l, l + len - 1);
}
int main(){
int n, m, a[1000], i;
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
quick_sort(a, 0, n - 1);
for(i = 0; i < n; i++){
if(a[i] > m) break;
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
该代码首先通过scanf函数输入数组长度和M的值,然后使用scanf函数遍历输入n个整数并存入数组a中。之后调用快速排序函数quick_sort对整个数组进行排序,最后输出小于等于M的数。由于该程序的核心是快速排序算法而不是数组输入输出部分,本文不再赘述输入输出函数的详细实现。
本题通过使用快速排序算法和选取小于等于M的数的函数,实现了对一个数组的排序和筛选功能,算法效率较高,可以处理大规模的数据集合。