📅  最后修改于: 2023-12-03 15:00:12.577000             🧑  作者: Mango
本篇介绍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函数。
在解决问题时,我们应该注意算法的效率、可读性和可维护性,以确保代码的稳定性和可扩展性。