排序算法
#include<iostream>
using namespace std;
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
1、直接插入排序(插入排序)
直接插入到适当的位置
void InsertSort(int a[], int n) {
for (int i = 1; i < n-1; i++) {
if (a[i] < a[i-1]) {
int j = i-1;
int tmp = a[i];
a[i] = a[i-1];
while (tmp < a[j]) {
a[j+1] = a[j];
j--;
}
a[j+1] = tmp;
}
}
}
效率 O(n^2)
2、希尔排序(插入排序)
将相距为d1 <n 的数分组排序,再取d2 <d1 再次排序,重复直至dt = 1将所有数字同组进行直接插入排序。
3、直接选择排序(选择排序)
得到数列中的最小数值到顶端
void SelectSort(int a[], int n) {
int min;
for (int i = 0; i < n-1; i++) {
min = i;
for (int j = i+1; j < n; j++) {
if (a[j] < a[min]) {
min = j;
}
}
swap(a[i], a[min]);
}
}
4、冒泡排序(交换排序)
将相邻数字依次调整,大数下沉小数上浮
void BubbleSort(int a[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (a[j] > a[j+1]) {
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
5、快速排序(交换排序)
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
6、堆排序(选择排序)
将最大数字移到堆顶然后跟最末节点交换,移出后再重置堆
7、归并排序
8、基数排序
排序 | 时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
插入排序 | O(n2) | O(1) | 稳定 |
希尔排序 | O(nlogn) | O(1) | 不稳定 |
冒泡排序 | O(n2) | O(1) | 稳定 |
快速排序 | O(n2) | O(nlogn) | 不稳定 |
选择排序 | O(n2) | O(1) | 稳定 |
堆排序 | O(nlogn) | O(1) | 不稳定 |