C++实现常用排序算法对比与测试
5星 · 超过95%的资源 需积分: 9 39 浏览量
更新于2024-09-15
收藏 404KB PDF 举报
排序算法的C++实现
排序算法是计算机科学中最基本和重要的算法之一,在实际应用中广泛使用。C++作为一门强大的编程语言,提供了多种排序算法的实现。本文将对常用的排序算法进行介绍和实现,包括冒泡排序、选择排序、插入排序、堆排序、快速排序、归并排序等,并对它们的时间和空间复杂度进行分析。
一、冒泡排序
冒泡排序是一种简单的排序算法,通过不断地比较相邻的元素,将最大的元素“冒泡”到数组的末尾。该算法的时间复杂度为O(n^2),空间复杂度为O(1)。以下是冒泡排序的C++实现代码:
```cpp
void bubble_sort(vector<int>& v) {
int n = v.size();
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (v[j] > v[j + 1]) {
swap(v[j], v[j + 1]);
}
}
}
}
```
二、选择排序
选择排序是一种简单的排序算法,通过选择最小或最大的元素,将其置于数组的开头。该算法的时间复杂度为O(n^2),空间复杂度为O(1)。以下是选择排序的C++实现代码:
```cpp
void select_sort(vector<int>& v) {
int n = v.size();
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < n; j++) {
if (v[j] < v[min_idx]) {
min_idx = j;
}
}
swap(v[i], v[min_idx]);
}
}
```
三、插入排序
插入排序是一种简单的排序算法,通过将每个元素插入到已排序的数组中。该算法的时间复杂度为O(n^2),空间复杂度为O(1)。以下是插入排序的C++实现代码:
```cpp
void insert_sort(vector<int>& v) {
int n = v.size();
for (int i = 1; i < n; i++) {
int key = v[i];
int j = i - 1;
while (j >= 0 && v[j] > key) {
v[j + 1] = v[j];
j--;
}
v[j + 1] = key;
}
}
```
四、堆排序
堆排序是一种高效的排序算法,通过构建堆将元素排序。该算法的时间复杂度为O(n log n),空间复杂度为O(1)。以下是堆排序的C++实现代码:
```cpp
void heap_sort(vector<int>& v) {
int n = v.size();
build_heap(v);
for (int i = n - 1; i > 0; i--) {
swap(v[0], v[i]);
heapify(v, 0, i);
}
}
void build_heap(vector<int>& v) {
int n = v.size();
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(v, i, n);
}
}
void heapify(vector<int>& v, int i, int n) {
int largest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if (l < n && v[l] > v[largest]) {
largest = l;
}
if (r < n && v[r] > v[largest]) {
largest = r;
}
if (largest != i) {
swap(v[i], v[largest]);
heapify(v, largest, n);
}
}
```
五、快速排序
快速排序是一种高效的排序算法,通过递归地将数组分成两个部分,分别排序。该算法的时间复杂度为O(n log n),空间复杂度为O(log n)。以下是快速排序的C++实现代码:
```cpp
void quick_sort(vector<int>& v) {
quick_sort_recursive(v, 0, v.size() - 1);
}
void quick_sort_recursive(vector<int>& v, int low, int high) {
if (low < high) {
int pivot = partition(v, low, high);
quick_sort_recursive(v, low, pivot - 1);
quick_sort_recursive(v, pivot + 1, high);
}
}
int partition(vector<int>& v, int low, int high) {
int pivot = v[low];
int i = low + 1;
int j = high;
while (i <= j) {
while (i <= j && v[i] <= pivot) {
i++;
}
while (i <= j && v[j] > pivot) {
j--;
}
if (i <= j) {
swap(v[i], v[j]);
}
}
swap(v[low], v[j]);
return j;
}
```
六、归并排序
归并排序是一种高效的排序算法,通过将数组分成两个部分,分别排序,然后合并。该算法的时间复杂度为O(n log n),空间复杂度为O(n)。以下是归并排序的C++实现代码:
```cpp
void merge_sort(vector<int>& v) {
int n = v.size();
if (n <= 1) {
return;
}
int mid = n / 2;
vector<int> left(v.begin(), v.begin() + mid);
vector<int> right(v.begin() + mid, v.end());
merge_sort(left);
merge_sort(right);
merge(left, right, v);
}
void merge(vector<int>& left, vector<int>& right, vector<int>& v) {
int i = 0;
int j = 0;
int k = 0;
while (i < left.size() && j < right.size()) {
if (left[i] <= right[j]) {
v[k++] = left[i++];
} else {
v[k++] = right[j++];
}
}
while (i < left.size()) {
v[k++] = left[i++];
}
while (j < right.size()) {
v[k++] = right[j++];
}
}
```
七、测试和对比
为了测试和对比这些排序算法,我们使用了 vector 容器来存储要排序的数据,并使用随机数 generator 生成了一个大小为 1000000 的数组。然后,我们使用每种排序算法对数组进行排序,并记录排序时间。结果表明,快速排序和归并排序的时间复杂度远远低于其他排序算法。
本文对常用的排序算法进行了介绍和实现,并对它们的时间和空间复杂度进行了分析。这些算法可以广泛应用于实际开发中,例如数据处理、数据库查询等领域。
2010-11-07 上传
2019-07-15 上传
2020-05-29 上传
2015-07-13 上传
2019-09-18 上传
2023-11-06 上传
2010-12-11 上传
2011-11-11 上传
2009-08-13 上传
zhengdingzhongxue
- 粉丝: 0
- 资源: 2
最新资源
- Android圆角进度条控件的设计与应用
- mui框架实现带侧边栏的响应式布局
- Android仿知乎横线直线进度条实现教程
- SSM选课系统实现:Spring+SpringMVC+MyBatis源码剖析
- 使用JavaScript开发的流星待办事项应用
- Google Code Jam 2015竞赛回顾与Java编程实践
- Angular 2与NW.js集成:通过Webpack和Gulp构建环境详解
- OneDayTripPlanner:数字化城市旅游活动规划助手
- TinySTM 轻量级原子操作库的详细介绍与安装指南
- 模拟PHP序列化:JavaScript实现序列化与反序列化技术
- ***进销存系统全面功能介绍与开发指南
- 掌握Clojure命名空间的正确重新加载技巧
- 免费获取VMD模态分解Matlab源代码与案例数据
- BuglyEasyToUnity最新更新优化:简化Unity开发者接入流程
- Android学生俱乐部项目任务2解析与实践
- 掌握Elixir语言构建高效分布式网络爬虫