📜  C测验– 106 |问题3(1)

📅  最后修改于: 2023-12-03 15:30:15.231000             🧑  作者: Mango

C测验 – 106 | 问题3

问题描述

给定一个长度为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的数的函数,实现了对一个数组的排序和筛选功能,算法效率较高,可以处理大规模的数据集合。