排序算法比较
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
希尔排序 | O(n1.3) | O(n2) | O(1) | 不稳定 | |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n2) | O(logn) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |
1. 冒泡排序(Bubble Sort)
1.1 算法说明
冒泡排序又名大数沉底法。重复遍历要排序的数组,一次比较两个元素,如果顺序错误就进行交换。重复遍历直到没有元素要进行交换,表示排序已经完成。冒泡排序从小到大的排序过程中,每一趟冒泡完成后,总是一个最大值沉到最后(下)面。
1.2 算法复杂度
最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)
1.3 算法实现
//从小到大排序
void BubbleSort(int a[] , int n){
for(int i = 0;i < n - 1;i++){
for(int j = 0;j < n - 1 - i;j++){
if(a[j] > a[j + 1]){
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
//从大到小排序
void BubbleSort1(int a[] , int n){
for(int i = 0;i < n - 1;i++){
for(int j = i;j < n - 1;j++){
if(a[j] < a[j + 1]){
int temp = a[j];
a[j] = a[j +