49.一道看上去很吓人的算法面试题:
如何对n 个数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
分析:时间复杂度O(n)的排序只能使用非比较排序,如基数排序,计数排序和桶排序等,这些排序都包含空间换时间的思想,都需要额外的空间来辅助操作,但空间复杂度O(1)的算法在一定条件限制下是有可能实现的。具体到这道题,我们限定这n个数为32位整数,那么我们就可以在常数空间复杂度,O(n)时间复杂度的前提下完成排序。
namespace MS100P_49
{
//计数排序
void countSort(int data[], int length)
{
int temp[65536]; //常量大小空间,O(1)
int min = data[0];
for (int i = 1; i < length; i++)
if (data[i] < min) min = data[i];
memset(temp, 0, 65536*sizeof(int));
for (int i = 0; i < length; i++)
temp[data[i] - min]++;
int k = 0;
for (int i = 0; i < 65536; i++)
while (temp[i]--)
data[k++] = i + min;
}
}