排序算法C++实现及详解

需积分: 26 5 下载量 80 浏览量 更新于2024-09-06 1 收藏 5KB TXT 举报
"该资源是一份关于各种排序算法的C++实现教程,包括详细的代码注释,适合排序算法初学者和准备面试的求职者。内容涵盖了冒泡排序(两种实现)、冒泡排序优化、选择排序、插入排序(两种方式)、快速排序和归并排序(递归与非递归)。" 本文将详细介绍这些排序算法的原理和C++实现。 1. **冒泡排序**: - 基本思想:通过重复遍历待排序序列,依次比较相邻元素并交换位置,使得较大的元素逐渐“浮”到序列末尾,就像水中的气泡一样上升。 - 实现方式1:基本冒泡排序,每次遍历时,相邻元素进行比较并交换,直到没有任何交换发生为止。 ```cpp void BubbleSort(int a[], int len) { int i, j, temp; bool flags = 0; for (j = 0; j < len - 1; j++) { for (i = 0; i < len - 1 - j; i++) { if (a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; flags = 1; // 如果有交换,设置标志位为1 } } if (flags == 0) return; // 如果没有交换发生,提前结束排序 } } ``` - 实现方式2:优化冒泡排序,当一轮遍历无任何交换时,说明序列已经有序,可以提前结束。 2. **冒泡排序优化**:在冒泡排序的基础上添加一个标志位,如果在一次遍历中没有发生交换,说明序列已经有序,可以提前结束排序。 3. **选择排序**: - 基本思想:每次从未排序的序列中找到最小(或最大)的元素,放到已排序序列的末尾,直到全部待排序的数据元素排完。 ```cpp int main() { int n = 10, a[n]; int i, j, tmp; // 初始化和输出原始序列 for (i = 0; i < n; i++) { a[i] = i + 1; cout << setw(4) << a[i]; } cout << endl; for (i = 0; i < n - 1; i++) { int minIndex = i; for (j = i + 1; j < n; j++) { if (a[minIndex] > a[j]) { minIndex = j; } } // 将找到的最小元素放到已排序序列的末尾 tmp = a[i]; a[i] = a[minIndex]; a[minIndex] = tmp; } // 输出排序后的序列 for (i = 0; i < n; i++) cout << setw(4) << a[i]; return 0; } ``` 4. **插入排序**: - 基本思想:将待排序的元素逐个插入到已排序的序列中,保持已排序序列的有序性。 - 实现方式1:直接插入排序,将每个元素与已排序部分的元素逐个比较,找到合适的位置插入。 - 实现方式2:二分插入排序,使用二分查找法找到插入位置,减少比较次数。 5. **快速排序**: - 基本思想:采用分治策略,选取一个基准元素,将序列分为两部分,一部分所有元素都小于基准,另一部分所有元素都大于基准,然后对这两部分分别进行快速排序。 - 代码实现略,因为快速排序通常涉及递归,实现较为复杂。 6. **归并排序**: - 基本思想:同样采用分治策略,将序列不断拆分为更小的子序列,然后合并这些子序列,直到每个子序列只有一个元素,再逐步合并回原序列。 - 实现方式1:递归实现,将序列拆分为两半,分别排序,然后合并。 - 实现方式2:非递归实现,使用辅助数组进行合并操作。 以上就是各种排序算法的基本介绍及其C++实现。每种排序算法都有其适用场景,例如冒泡排序适用于小规模数据,而快速排序和归并排序则更适合大规模数据的排序。理解这些排序算法的工作原理,并能熟练编程实现,对于提升编程能力、解决实际问题具有重要意义。