C++实现常用排序算法对比与测试
5星 · 超过95%的资源 需积分: 9 154 浏览量
更新于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 上传
2014-06-03 上传
2009-08-13 上传
zhengdingzhongxue
- 粉丝: 0
- 资源: 2
最新资源
- 音乐播放次数最多的谱图还原:音乐播放次数最多
- Cpp_Project_1:C ++ Udacity课程的第一个项目
- eclipse-cpp-mars-R-linux-gtk-x86_64.tar.gz
- react-design-furnitures:我的第一个应用程序
- Titanic_Dataset_PurePython
- AndroidStudio_Projects
- opencv-demo-webapp-snap:一个简单的 OpenCV webapp 示例
- ACCESS网上聊天室ASP毕业设计(源代码+论文+开题报告+任务书+答辩PPT).zip
- Accuinsight-1.0.33-py2.py3-none-any.whl.zip
- Auth0-Regular-Web-App-Test
- WebFamily:Beetlex Web SPA应用组件
- 费利斯cumplea-os
- MainPartExtractor:获取句子的主谓宾
- tornado_circus_heroku:使用Circus在一个Heroku dyno上管理一堆Tornado应用程序进程
- 模拟量的转换程序1.rar
- test-deploy-actions