交换排序就是通过比较交换实现排序。分冒泡排序和快速排序两种。
顾名思义就是大的就冒头,换位置。
通过多次重复比较、交换相邻记录而实现排序;每一趟的效果都是将当前键值最大的记录换到最后。
冒泡排序算法的原理如下:
时间复杂度:O(n²)
空间复杂度:O(1)
#include
using namespace std;
// 冒泡
int main() {
int arr[8] = {45, 38, 66, 90, 88, 10, 25, 45};
int arrCount = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < arrCount - 1; i++) {
for (int j = 0; j < arrCount - i - 1; j++) {
if (arr[j] > arr[j+1]) { // 对比两个值
int tmp = arr[j];
// 交换位置
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
cout<
输出结果:
1次排序后:38 45 66 88 10 25 45 90
2次排序后:38 45 66 10 25 45 88 90
3次排序后:38 45 10 25 45 66 88 90
4次排序后:38 10 25 45 45 66 88 90
5次排序后:10 25 38 45 45 66 88 90
6次排序后:10 25 38 45 45 66 88 90
7次排序后:10 25 38 45 45 66 88 90
最后结果:10 25 38 45 45 66 88 90
关键词:基准值,递归算法
快速排序(Quicksort),计算机科学词汇,适用领域Pascal,C++等语言,是对冒泡排序算法的一种改进。
快速排序算法流程如下:
时间复杂度:O() 、最差O(n²) (注:快速排序在表基本有序时,最不利于其发挥效率,即蜕化为冒泡排序,其时间复杂度为O(n²))
空间复杂度:O()
在交换的过程中相同的数值可能会被换到前面去,所以是不稳定的。
在经历第一趟之后,我们将基准值左边和右边分别进行同样的操作。
left和right从原先的0和7,更新为对应的数值:
第一趟排序之后: [25 38 10] 45 [88 90 66 45]
分别对子序列排序:
左边子序列排序: [25 38 10] > left = 0, right = 2, flag = 25
[10] 25 [38]
再对25左右两侧进行同样的排序方式,得出左边子序列排序后的结果:
10 25 38
右边子序列排序: [88 90 66 45] > left = 4, right = 7, flag = 88
[45 66] 88 [90]
再对88左右两侧进行同样的排序方式,最后得到右边子序列排序后的顺序 :
45 66 88 90
合并起来就是: [10 25 38 45 45 66 88 90]
由于交换规则一致,我们可以用递归来处理。
#include
using namespace std;
/// 交换位置
void swapPosition(int arr[], int x, int y) {
arr[x] = arr[y]+arr[x];
arr[y] = arr[x] - arr[y];
arr[x] = arr[x] - arr[y];
}
void quickSort(int list[], int begin, int end) {
// 将基准值flag定为列表第一个。
int left = begin, right = end, flag = list[begin];
cout<<"这趟排序的起始位置:"<= flag && left
输出结果:
这趟排序的起始位置:0,结束位置:7,基准值:45
结果:25 38 10 45 88 90 66 45
开始左边的递归:
这趟排序的起始位置:0,结束位置:2,基准值:25
结果:10 25 38 45 88 90 66 45
开始右边的递归:
这趟排序的起始位置:4,结束位置:7,基准值:88
结果:10 25 38 45 45 66 88 90
开始左边的递归:
这趟排序的起始位置:4,结束位置:5,基准值:45
结果:10 25 38 45 45 66 88 90
最后结果:10 25 38 45 45 66 88 90
参考:
百度百科——冒泡排序:https://baike.baidu.com/item/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F?fromModule=lemma_search-box
百度百科——快速排序:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fr=ge_ala
生命不息,学习不止,若有不正确的地方,欢迎指正。