您的位置:首页 > 理论基础 > 数据结构算法

数据结构——算法之(017)( 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1))

2014-05-25 20:51 1296 查看
【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】

题目:

如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

题目分析:

一、乍一看,不可能完成。时间复杂度为n,纵观所有的排序法,没有达到这个级别的

二、如果针对的是有限个数排列,可以采用标记法,或者说它是一种hash思想的方法,申请一个大大的数组hash[65536]

然后对相应的位置标记一下,重复的数字则叠加

例如:

0----->hash[0]++;

5----->hash[5]++;

100--->hash[100]++;

算法实现:
#include <stdio.h>

static int hash[65536] = {0};
void hash_sort(int *array, int size)
{
int i=0;
for(; i<size; i++)
hash[array[i]]++;
}

int main(int argc, char *argv[])
{
int a[] = {1, 4, 1, 2, 5, 13, 4, 6, 8, 1000, 999, 9,};

//sort
int size = sizeof(a)/sizeof(int);
hash_sort(&a, size);

//print the array
int i = 0;
for(; i<65536 && size--; i++)
{
while(hash[i] != 0)
{
printf(" %d", i);
hash[i]--;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐