Hello,本篇博客Val要和大家分享关于如何对数组进行排序,且时间复杂度为O(N);和求无序数组的中位数。
例题:
1 . int a[] = { 12, 13, 12, 13, 19, 18, 15, 12, 15, 16, 17 },要求对数组a进行排序,要求时间复杂度为O(N)
2.求一个无序数组的中位数。
如:{ 2, 5, 4, 9, 3, 6, 8, 7, 1 }的中位数为5,{ 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 }的中位数为4和5。
1、回顾排序知识
首先让我们来回顾一下排序相关内容,我们知道排序有:
插入排序:直接插入排序,shell排序
选择排序:选择排序,堆排序
交换排序:快速排序, 冒泡排序
归并排序
排序的时间复杂度,空间复杂度和稳定性如下表:
排序方法 | 平均 | 最好 | 最坏 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
插入排序 | O(N*N) | O(N) | O(N*N) | O(1) | 稳定 |
shell排序 | O(N^1.3) | O(N) | O(N*N) | O(1) | 不稳定 |
选择排序 | O(N*N) | O(N*N) | O(N*N) | O(1) | 不稳定 |
堆排序 | O(N*lgN) | O(N*lgN) | O(N*lgN) | O(1) | 不稳定 |
冒泡排序 | O(N*N) | O(N) | O(N*N) | O(1) | 稳定 |
快速排序 | O(N*lgN) | O(N*lgN) | O(N*N) | O(lgN) | 不稳定 |
归并排序 | O(N*lgN) | O(N*lgN) | O(N*lgN) | O(N) | 稳定 |
稳定的排序有三个:直接插入排序、冒泡排序、归并排序
稳定性:相同的数经过排序,它俩的位置不会发生交换
之前我写的博客里有对这些排序的代码实现:
插入排序和shell排序:http://blog.csdn.net/valdc_morning/article/details/74012482
选择排序和堆排序: