前言
继上篇学习了排序的前面两个部分:直接插入排序和选择排序,今天我们来学习排序中常用的交换排序以及非常稳定的归并排序。快排有多种方法,高速列车即将发车。
一、交换排序
交换排序基本思想: 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
1.1 冒泡排序
冒泡排序是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。这个算法在平常算法题中基本不用(因为太慢了),只能说具有教学意义。
void BubbleSort(int* a, int n) {
int exchange = 0;
for (int i = 0; i < n; i++) {
exchange = 0;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
exchange = 1;
swap(a[j], a[j + 1]);
}
}
if (!exchange)
break;
}
}
冒泡排序的特性总结:
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
1.2 快速排序
快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后对左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
快速排序实现主框架: 其实快排主要就是递归,把一个大区间不断划分成子区间
void QuickSort(int* a, int left, right) {
(left >= right)
;
meet = (a, left, right);
(a, left, meet - );
(a, meet + , right);
}


