1 交换排序
根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
2 冒泡排序
2.1 基本思想
在区间[0,n-1]中,相邻元素进行比较,大的元素向后移动,并减小区间,在[0,n-2]中重复上述操作,直至不再有元素的移动或者区间大小为1时排序完成。
2.2 算法示意图
2.3 程序代码
#include<stdio.h>
#include<stdlib.h>
void swap(int* arr, int pose1, int pose2) {
int tmp = arr[pose1];
arr[pose1] = arr[pose2];
arr[pose2] = tmp;
}
void bubbleSort(int* arr, int n) {
int end = n - 1;
while (end > 0) {
int flag = 0;//标记一轮冒泡排序中是否发生了交换
//一轮冒泡排序
for (int i = 0; i < end; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
flag = 1;
}
}
//如果没有发生交换,说明剩余元素全部有序
if (flag == 0)
break;
end--;
}
}
2.4 代码验证
void testBubbleSort() {
int arr[] = {
9 ,1,2,5,7,4,8,6,3,5 };
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int main() {
testBubbleSort();
return 0;
}
代码运行结果:
2.5 冒泡排序特性
- 冒泡排序是一种非常容易理解的排序
- 时间复杂度: O ( N 2 ) O(N^2) O(N2)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 稳定性:稳定
3 快速排序
3.1 基本思想
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
将区间按照基准值划分为左右两半部分的常见方式有:
1.hoare版本
2.挖坑法
3.前后指针版本
3.2 hoare法
3.2.1 基本思想
- 选取一个基准值
- 从剩余元素中开始遍历:
1.从后向前找到第一个小于基准值的数据
2.从前向后找到第一个大于基准值的数据
3.交换找到的两个值
4.从交换位置,分别开始,继续执行第一步
3.2.2 算法示意图
3.2.3 程序代码
#include<stdio.h>
#include<stdlib.h>
void swap(int* arr, int pose1, int pose2) {
int tmp = arr[pose1];
arr[pose1] = arr[pose2];
arr[pose2] = tmp;
}