【PTA数据结构 | C语言版】排序算法正确性测试

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

此题仅用于测试各种排序算法的基本正确性,并不测试其效率,故测试数据规模较小。

输入格式:
输入首先给出一个正整数 n(≤100),随后一行给出 n 个值不超过 10^3 的待排序的正整数。同行数字间以空格分隔。

输出格式:
在一行中输出按非递减序排列好的有序序列。为简化输出处理,每个数字后面跟一个空格。

输入样例:
20
19 10 1 1 2 4 18 3 5 12 9 7 3 3 15 15 17 8 6 11

输出样例:
1 1 2 3 3 3 4 5 6 7 8 9 10 11 12 15 15 17 18 19

代码

#include <stdio.h>
#include <stdlib.h>

// 冒泡排序函数:按非递减序排列数组
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        // 每轮冒泡将最大元素"浮"到末尾
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换元素
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    
    int* arr = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    // 调用冒泡排序
    bubbleSort(arr, n);
    
    // 输出排序结果,每个数字后带一个空格
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}
<think>首先,用户查询是关于在C语言中实现PTA的选择排序。PTA 很可能指的是程序设计类在线评测系统,类似于一个在线评判平台。 我提供了几个内部引用: - 参考文献[1]:展示了一个选择排序的基本实现,但代码似乎正确,因为它使用了嵌套循环和交换,而是标准的选择排序。 - 参考文献[2]:这看起来更像选择排序。它查找最小值并在每轮外部循环后交换。 - 参考文献[3]:另一个选择排序的实现,但代码有错误,比如在错误的位置交换。 - 参考文献[4] 和 [5]:关于冒泡排序,这与选择排序无关。 用户明确提到了“选择法排序”,所以我应该专注于参考文献[1]、[2] 和 [3],但需要纠正任何错误。 关键要素: - 选择排序:算法通过重复寻找未排序部分的最小(或最大)元素并将其放在开头。 - 在 C 中实现:我需要提供一个正确、清晰的代码示例。 - 参考 PTA:确保代码符合 PTA 的风格,例如处理输入/输出。 从参考文献[2]来看,它似乎是正确的:它使用外部循环遍历数组,在内部循环中查找最小元素,然后交换。 参考文献[3] 是用于降序排序,但结构相似。 我的回应应该是: 1. 解释选择排序算法2. 提供用 C 语言编写的正确实现。 3. 确保代码格式正确,使用代码块。 4. 在最后生成相关问题。 结构化我的回答: - 从简介开始:什么是选择排序。 - 逐步解释算法。 - 展示代码。 - 讨论任何 PTA 的特定内容(例如,输入格式)。 - 最后提出相关问题。 系统指令: - 所有行内数学表达式使用 $...$,但由于这是关于代码的,可能需要过多数学知识,但如果有比较,可能使用如 $O(n^2)$。 - 独立公式使用 $$...$$,但可能适用。 - 使用中文。 - 生成相关问题。 - 在回答中,如果引用段落,添加引用标识,但用户说“上述引用仅供参考”,所以我应该主要根据我的知识回答,但参考这些内容以确保准确性。 用户说:“上述引用仅供参考,并是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一条消息,所以可能没有“上一次的问题”。我应该使用这些引用作为指导。 用户的上一条消息是系统指令,所以这可能是第一条用户查询。 根据这些引用,我会提供正确的实现。 正确的选择排序在C语言中的实现: ```c #include <stdio.h> void selectionSort(int arr[], int n) { int i, j, min_idx, temp; for (i = 0; i < n-1; i++) { min_idx = i; // 假设当前元素是最小的 for (j = i+1; j < n; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; // 找到更小的元素 } } // 交换找到的最小元素与第一个未排序位置的元素 temp = arr[min_idx]; arr[min_idx] = arr[i]; arr[i] = temp; } } int main() { int n, i; scanf("%d", &n); // 输入数组大小 int arr[n]; for (i = 0; i < n; i++) { scanf("%d", &arr[i]); // 输入数组元素 } selectionSort(arr, n); // 调用排序函数 // 输出排序后的数组 for (i = 0; i < n; i++) { printf("%d", arr[i]); if (i < n-1) printf(" "); // 行末得有多余空格 } return 0; } ``` 这是用于升序排序。在参考文献[3]中,它是用于降序,但原理相同。 在PTA问题中,输入可能包括大小和数组,输出是排序后的数组,能有多余的空格,正如参考文献[5]中提到的。 我应该解释代码。 最后,生成相关问题。 相关问题: 1. 选择排序的时间复杂度是多少? 2. 选择排序与冒泡排序的区别? 3. 如何优化选择排序? 4. PTA中常见的选择排序题目有哪些? 确保回答是中文的。 </think> ### C语言实现PTA选择法排序 选择法排序(Selection Sort)是一种简单直观的排序算法,适用于小规模数据。其核心思想是:每次从未排序部分中找出最小(或最大)元素,将其与未排序部分的起始位置交换。重复此过程,直到整个数组有序。该算法的时间复杂度为 $O(n^2)$,其中 $n$ 是数组大小,适用于PTA(程序设计类在线评测系统)中的基础排序题目[^1][^2][^3]。 #### 算法步骤: 1. **初始化**:从数组的第一个元素开始,作为未排序部分的起始点。 2. **查找最小值**:在未排序部分中遍历查找最小元素的索引。 3. **交换元素**:将找到的最小元素与未排序部分的起始元素交换。 4. **重复过程**:将未排序部分的起始位置后移一位,重复步骤2-3,直到整个数组有序。 #### C语言代码实现 以下是针对PTA平台的标准实现,代码符合PTA输入输出要求(例如,输入数组大小和元素,输出排序后数组,且行末得有多余空格)。代码使用选择法对数组进行升序排序。 ```c #include <stdio.h> int main() { int n; // 数组大小 scanf("%d", &n); // 输入数组大小 int a[n]; // 定义数组 // 输入数组元素 for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } // 选择法排序(升序) for (int i = 0; i < n - 1; i++) { int min_idx = i; // 假设当前起始位置是最小值索引 // 在未排序部分查找最小值索引 for (int j = i + 1; j < n; j++) { if (a[j] < a[min_idx]) { min_idx = j; // 更新最小值索引 } } // 交换元素:将最小值放到正确位置 int temp = a[i]; a[i] = a[min_idx]; a[min_idx] = temp; } // 输出排序后的数组(行末无多余空格) printf("%d", a[0]); for (int i = 1; i < n; i++) { printf(" %d", a[i]); } return 0; } ``` #### 代码说明: - **输入格式**:第一行输入整数 `n`(数组大小),第二行输入 `n` 个整数作为数组元素。例如,输入 `5\n 3 1 4 2 5`。 - **输出格式**:输出排序后的数组,元素间用空格分隔,行末无多余空格。例如,输出 `1 2 3 4 5`。 - **PTA注意事项**: - 该代码直接使用 `int a[n]` 定义数组,这在C99标准中支持(PTA通常支持C99)。 - 输出时通过 `if (i < n-1)` 或类似逻辑避免行末空格,符合PTA评测要求(参考引用[5])[^5]。 - **算法优化**:此实现是基础版本,未优化。实际中,选择排序的交换次数固定为 $O(n)$,但比较次数为 $O(n^2)$,因此效率较低,适合教学或小数据集。 如果您需要在PTA上处理特定问题(如降序排序或部分排序),可调整比较条件(例如,将 `if (a[j] < a[min_idx])` 改为 `if (a[j] > a[min_idx])` 实现降序)。更多细节可参考PTA官方题目描述[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值