各个常见排序:
这些排序对数组的乱序不做要求:
排序 | 平均时间复杂度 | 空间复杂度 |
---|---|---|
冒泡 | o(n*n) | o(1) |
插入 | o(n*n) | o(1) |
快速 | o(n*log n) | o(log n) |
选择 | o(n*n) | o(1) |
归并 | o(n*log n) | o(n) |
抽屉排序:
一种对排序数组的结构有一定要求的排序算法,比如:
要求长为n的数组里的内容为1-n的全部数字各一个。
在这种特殊条件下,可以使用抽屉排序,使得时间复杂度为O(n)。
代码:
void sort(vector<int>& nums) { //6,1,2,5,-1,-1
int len = nums.size();
for (int i = 0;i < len;i++) { //抽屉排序
while (nums[i] != i + 1) //每一次while循环,d都会执行数次swap
swap(nums[i], nums[nums[i] - 1]); //每执行一次,nums[i]都被永远放到了正确的位置上,所以最坏情况下swap也只会执行<len+2次
}
}