排序算法总结:
特点 名称 | 时间复杂度 | 原理 | 稳定性 | 举例(3,1,4,5,2) |
名次排序 | O(n2) | 先排出名次,再根据名次,将数据放入相应 的数组排序 | 稳定 | 名次是(3,1,4,5,2) 排序是(1,2,3,4,5) |
冒泡排序 | O(n2) | 一次冒泡是从前面开始两两比较,如果前面大 后面数小就互换,共冒n次泡 | 稳定 | 一次冒泡:1,3,4,2,5 二次冒泡:1,3,2,4,5 三次冒泡:1,2,3,4,5 四次冒泡:1,2,3,4,5 五次冒泡:1,2,3,4,5 |
插入排序 | O(n2) | 第一个数据不动,将第二个与之比较,并插 入,第三个与前两个比较并插入....直到n个 | 稳定 | 插入第二个:1,3,4,5,2 插入第三个:1,3,4,5,2 插入第四个:1,3,4,5,2 插入第五个:1,2,3,4,5 |
选择排序 | O(n2) | n个数中选择最大的放在最后,再在前n-1个 选择最大的放在倒数第二个...直到第一个. | 稳定 | 第一次:3,1,4,2,5 第二次:3,1,2,4,5 第三次:1,2,3,4,5 第四次:1,2,3,4,5 |
基数排序 | Θ(n) | 按照基数r分为r个盒子,将符合条件的数据 放入相应链表盒子里,直到排序完成 | 稳定 | 一次:1,2,3,4,5 |
堆排序 | O(nlogn) | 利用最大堆排序,将数据初始化为最大堆,依次 删除最大元素,直到删完,排序完成 | 不稳定 | 删除5,删除4,删除3, 删除2,删除1,依次放入链表, 12345 |
拓扑排序 | O(n2) | 在由任务建立的有向图中,边(i,j)表示在装配 序列中任务i 在任务j 的前面,具有这种性质 的序列称为拓扑序列根据任务的有向图建立 拓扑序列的过程 | 稳定 | 无 |
快速排序 | 平均O(nlog2n) 最坏O(n2) | 不断寻找一个序列的中点,然后对中点左右 的序列递归的进行排序,直至全部序列排序 完成,使用了分治的思想 | 稳定 | 第一次;1,3,4,5,2 第二次:1,3,4,2,5 第三次:1,2,3,4,5 |
归并排序 | 平均O(nlog2n) 最坏O(nlog2n) | 将原序列划分为有序的两个序列,然后利用 归并算法进行合并,合并之后即为有序序列。 | 稳定 | 3,1 4,5,2 1,3 2,4,5 1, 2, 3 ,4, 5 |
可视化链接:https://visualgo.net/zh/sorting
1.插入排序:
与vector类型相比,数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度。数组没有获取其容量大小的size操作。那么我们就可以用vector或数组array来实现这些操作。
思想与伪代码:
复杂度:最优:当输入数组就是排好序的时候,复杂度为O(n)。最差:当输入数组为倒序时,复杂度为O(n^2)
//插入排序,从小到大排序
void insert_sort(int arraylist[],int num) {
int key;
for (int j = 1; j< num; j++) {
key = arraylist[j];
int i = j - 1;
while (i >= 0 && arraylist[i] > key) {
arraylist[i + 1] = arraylist[i];
i = i - 1;
}
arraylist[i + 1] = key;
}
}
2.冒泡排序:
思想与伪代码:两两交换,后比前小就交换。复杂度:O(n^2)
//交换两个数
void swap(int* a, int* b) {
int temp =* a;
*a =* b;
*b = temp;
}
void bubble_sort(int arraylist[],int num) {
for (int j = 0; j < num; j++) {
for (int i = num - 1; i >= j; i--) {
if (arraylist[i] < arraylist[i - 1]) {
swap(&arraylist[i],&arraylist[i - 1]);
}
}
}
}
3.选择排序:
思想与伪代码:每次寻找最小值与当前位置交换。复杂度:O(n^2)
void select_sort(int arraylist[], int num) {
for (int i = 0; i < num - 1; i++) {
int min =i;
for (int j = i + 1; j < num; j++) {
if (arraylist[j] <arraylist[min]) {
min = j;
}
}
swap(&arraylist[min], &arraylist[i]);
}
}
以上插入排序、冒泡排序、选择排序运行程序:
#include <iostream>
#include "1sort.h"
using namespace std;
int main() {
const int num = 10;
int array[] = {7,2,26,4,9,17,6,25,19,8};
//insert_sort(array,num);
//bubble_sort(array, num);
select_sort(array,num);
//打印结果
for (int i = 0; i < num; i++) {
cout << array[i] << " ";
}
system("pause");
return 0;
}
4.归并排序:
思想与伪代码:利用分治法思想排序。复杂度:O(nlgn)
5.堆排序
堆排序其实是利用堆这种数据结构的一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),是不稳定排序。
一般情况下,升序排序用大根堆,降序排序用小根堆。
6.快速排序
7.基数排序
8.计数排序
9.桶排序
正在总结中。。