1、冒泡排序
原理
1、从后往前(从前往后)两两比较相邻元素的值,若为逆序,则交换它们,直到序列比较完,称这样的过程为"一趟冒泡排序",最多只需n-1趟排序
2、每一趟排序都可以使一个元素的移动到最终位置,已经确定最终位置的元素在之后的处理中无需再对比
3、如果某一趟排序过程中未发生"交换",则算法可提前结束
图解
代码
void BubbleSort(int *a, int n) {
int i, j, t;
bool flag = true;
for (i = 0; i < n; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
flag = false;
}
}
if (flag == true) {
return;
}
}
}
复杂度
时间复杂度:
最好:全部有序: O ( n ) O(n) O(n)
最坏:全部逆序: O ( n 2 ) O(n^2) O(n2)
平均: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
稳定性
冒泡排序是稳定的
适用性
适用于顺序表、链表
2、选择排序
原理
1、每一次在待排序元素中选取关键字最小的元素与当前位置的元素进行交换,直到最后两个元素完成交换
2、必须进行总共n-1次处理
图解
代码
void SelectSort(int *a, int n) {
int i, j, t, min;
for (i = 0; i < n - 1; i++) {
min = i;
for (j = i + 1; j < n; j++) {
if (a[j] < a[min]) {
min = j;
}
}
if (min != i) {
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
复杂度
时间复杂度:
最好: O ( n 2 ) O(n^2) O(n2)
最坏: O ( n 2 ) O(n^2) O(n2)
平均: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
稳定性
选择排序是不稳定的
适用性
适用于顺序表、链表