冒泡排序(bubbleSort.cpp)

本文介绍了冒泡排序算法,并提供了两种实现方式:bubbleSort1.cpp 和 bubbleSort2.cpp。第一种按照传统从左到右的方式进行冒泡,第二种则是从右到左扫描。文章详细阐述了输入输出样例及数据限制,强调了排序趟数与排序结果的关系。

冒泡排序1bubbleSort1.cpp

【题目描述】

给定整数n(待排序整数的个数)和k(冒泡排序的趟数)、以及n个待排序的整数,要求从小到大进行k冒泡排序,并输出第k冒泡排序的结果各整数之间用一个空格隔开排序左到右扫描未排序数据并将最大的元素交换(移动到未排序数据

【输入】

输入bubbleSort1.in的第一行一个整数n(1<n≤30000),为待排序数据的个数紧接着一行共有n排序的整数,每个整数之间用空格隔开一个整数kk³1),为第几趟冒泡排序。

【输出】

输出bubbleSort1.out包括n个整数,是第k冒泡排序后的结果各整数之有一个空格隔开。

【输入输出样例1

<think> 我们被要求使用C++实现四种排序算法:直接插入排序冒泡排序、快速排序和直接选择排序。 根据引用[1]中提供了插入排序的示例,我们可以参考其风格来实现其他排序算法。 注意:每个排序算法我们将分别实现,在main函数中分别调用它们进行测试。 我们将分别编写四个排序函数: 1. insertionSort - 直接插入排序 2. bubbleSort - 冒泡排序 3. quickSort - 快速排序(包含辅助函数,如分区函数) 4. selectionSort - 直接选择排序 为了清晰,我们将在一个程序中展示所有排序算法,但为了避免代码过长,我们只展示排序函数和主函数的基本测试。 注意:由于快速排序通常使用递归,我们将实现一个递归的快速排序。 此外,我们将在每个排序函数前加上注释说明算法思想。 由于用户要求,我们将使用中文注释(但函数名和变量名仍用英文,这是C++的常见做法)。 开始编写代码: </think> 以下是使用C++实现的四种经典排序算法:直接插入排序冒泡排序、快速排序和直接选择排序。每种算法都包含详细注释说明其工作原理: ### 1. 直接插入排序 ```cpp #include <iostream> using namespace std; // 直接插入排序 void insertionSort(int arr[], int n) { // 从第二个元素开始遍历(索引1) for (int i = 1; i < n; i++) { int key = arr[i]; // 当前待插入元素 int j = i - 1; // 将于key的元素后移 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; // 插入到正确位置 } } ``` ### 2. 冒泡排序 ```cpp // 冒泡排序 void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { bool swapped = false; // 优化:检查是否发生交换 for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr[j], arr[j + 1]); // 交换相邻元素 swapped = true; } } if (!swapped) break; // 本轮无交换说明已有序 } } ``` ### 3. 快速排序 ```cpp // 快速排序分区函数 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选择最后一个元素为基准 int i = low - 1; // 较小元素的边界索引 for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; swap(arr[i], arr[j]); // 将小于基准的元素移到左侧 } } swap(arr[i + 1], arr[high]); // 将基准放到正确位置 return i + 1; } // 快速排序主函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 获取分区点 quickSort(arr, low, pi - 1); // 递归排序左子数组 quickSort(arr, pi + 1, high); // 递归排序右子数组 } } ``` ### 4. 直接选择排序 ```cpp // 直接选择排序 void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIdx = i; // 记录最小元素索引 for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; // 更新最小元素索引 } swap(arr[minIdx], arr[i]); // 将最小元素交换到已排序序列末尾 } } ``` ### 测试主函数 ```cpp int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr)/sizeof(arr[0]); // 测试插入排序 insertionSort(arr, n); cout << "插入排序结果: "; for (int i=0; i<n; i++) cout << arr[i] << " "; // 重置数组测试其他排序... // 实际使用时每次测试一种排序算法 return 0; } ``` ### 算法特点对比 | 排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 | |--------------|------------------|------------|--------|------------------------| | **直接插入** | $O(n^2)$ | $O(1)$ | 稳定 | 小规模或基本有序数据 | | **冒泡排序** | $O(n^2)$ | $O(1)$ | 稳定 | 教学用途 | | **快速排序** | $O(n \log n)$ | $O(\log n)$| 不稳定 | 规模通用排序[^1] | | **直接选择** | $O(n^2)$ | $O(1)$ | 不稳定 | 数据移动成本高的场景 | [^1]: 快速排序在实际应用中通常表现最优,是C++标准库`std::sort()`的常用实现基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值