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

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

C测验– 106 |问题2介绍

本篇介绍C语言测验中的第二个问题,让我们一起来看看这个问题是什么。

问题描述

给定一个长度为n的数组a,请你写一个函数,将它们按照升序排序,并返回排序后的数组。

函数的原型如下:

int *sort(int *a, int n);
解题思路

这是一个经典的排序问题,我们可以使用任意一种排序算法来解决它。从简单的冒泡排序到高级的快速排序都可以使用。

在C语言中,有许多现成的排序算法库供我们使用,比如qsort函数,它是标准C库中的函数之一,可以按照升序或降序对数组进行排序。

下面是一个基本的快速排序算法的实现。我们将数组中第一个元素选为基准,然后将小于它的数放在它左边,大于它的数放在它右边,然后递归地对左右两边进行排序。

void quicksort(int *a, int left, int right) {
    int i, j, pivot, temp;
 
    if (left < right) {
        pivot = left; // 将第一个元素选为基准
        i = left;
        j = right;
 
        while (i < j) {
            while (a[i] <= a[pivot] && i <= right) // 从左往右找到第一个大于基准的元素
                i++;
            while (a[j] > a[pivot]) // 从右往左找到第一个小于等于基准的元素
                j--;
            if (i < j) { // 交换两个元素的位置
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
 
        temp = a[pivot]; // 将基准与找到的小于等于基准的元素交换
        a[pivot] = a[j];
        a[j] = temp;
 
        quicksort(a, left, j - 1); // 对左半部分进行递归排序
        quicksort(a, j + 1, right); // 对右半部分进行递归排序
    }
}
完整代码

下面是完整的代码,包括对输入数据的读取和结果的输出。你可以将代码复制到IDE中运行测试。

#include <stdio.h>

void quicksort(int *a, int left, int right) {
    int i, j, pivot, temp;
 
    if (left < right) {
        pivot = left; // 将第一个元素选为基准
        i = left;
        j = right;
 
        while (i < j) {
            while (a[i] <= a[pivot] && i <= right) // 从左往右找到第一个大于基准的元素
                i++;
            while (a[j] > a[pivot]) // 从右往左找到第一个小于等于基准的元素
                j--;
            if (i < j) { // 交换两个元素的位置
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
 
        temp = a[pivot]; // 将基准与找到的小于等于基准的元素交换
        a[pivot] = a[j];
        a[j] = temp;
 
        quicksort(a, left, j - 1); // 对左半部分进行递归排序
        quicksort(a, j + 1, right); // 对右半部分进行递归排序
    }
}

int *sort(int *a, int n) {
    quicksort(a, 0, n - 1);
    return a;
}

int main() {
    int i, n, a[100];

    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);

    sort(a, n);

    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    return 0;
}
总结

本篇介绍了C语言测验中的第二个问题,让我们了解了如何使用快速排序算法对数组进行排序。在实际编程中,我们可以使用现成的排序算法库,例如qsort函数。

在解决问题时,我们应该注意算法的效率、可读性和可维护性,以确保代码的稳定性和可扩展性。