各种数组排序C版
先看结论:
排序算法 | 平均时间复杂度 |
---|---|
冒泡排序 | O(N^2) |
选择排序 | O(N^2) |
插入排序 | O(N^2) |
希尔排序 | O(N^1.5) |
快速排序 | O(NlogN) |
归并排序 | O(NlogN) |
堆排序 | O(NlogN) |
基数排序 | O(d(n+r)) |
冒泡排序
for(int i = 0 ; i < arr.size(); i++){
for(int j = i+1; j < arr.size(); j++){
if(arr[j - 1] > arr[j]){
swap(arr[j], arr[j-1]);
}
}
}
选择排序
每次遍历,找到最小的数值与第一个元素交换
for(int i = 0; i < arr.size(); i++){
int minIndex = i;
for(int j = i + 1; j < arr.size(); j++){
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
if(minIndex != i){
swap(arr[i], arr[minIndex]);
}
}
插入排序
for(int i= 0; i < arr.size(); i++){
for(int j = i + 1; j > 0; j--){
if(arr[j-1] > arr[j]){
swap[arr[j-1], arr[j]];
}
else
break;
}
}
希尔排序
根据某一增量分为若干子序列,并对子序列分别进行插入排序
快速排序
先寻找一个pivot,然后和pivot比大小,分成两堆。重复该过程直至每堆只有一个数字
void Qsort(int *arr, int left, int right){
if(left >= right )
return;
int key = arr[left];
int i = left;
int j =right;
while(i < j && a[j] >= key){
j--;
}
if(i < j)
{
a[i] = a[j];
i++;
}
while(i < j && a[i] < key ){
i++;
}
if(i < j){
a[j] = a[i];
j--;
}
a[i] = key;
Qsort(arr, left, i - 1);
Qsort(arr, i + 1, right);
}
归并排序
Divide and conquer
关于STL中sort()
头文件下的sort方法很方便,实现原理是
sort里一共结合了三种算法:快速排序,插入排序,堆排序
reference
[C++一道深坑面试题:STL里sort算法用的是什么排序算法?](