您的位置:首页 > 其它

删除无序数组中跳跃重复值并排序(时间复杂度为O(n))

2014-09-19 18:55 961 查看
删除无序数组中跳跃重复值并排序(时间复杂度为O(n))

一、问题描述;

现有一无序的数组(元素的离散度较小),要删除数组中的重复值,并排序,时间复杂度为线性阶,空间复杂度为常量阶。

二、代码;

/<span style="font-size:18px;">/删除无序数组中跳跃重复值并排序(时间复杂度为O(n));
#include <stdio.h>
#include <stdlib.h>
const int n = 10; //待处理数组的大小
void Delete(int a[] ,int length)
{
int cnt[101]={0}; //用来统计值的个数
int i, k = 0, j = 0; //k用来记录表长减少的个数

for(i = 0; i < length; i++){
cnt[a[i]]++;
}
for(i = 0; i < 101; i++){
if(cnt[i]){ //统计数组不为零
k = cnt[i] - 1 + k; //k用来记录表长减少的个数
a[j] = i;
j++;
}
}

for(i = 0;i < length - k ; i++){ //输出
printf("%d", a[i]);
}

}

int main()
{
int a
, i;
printf("请输入%d个数,0-100:\n", n);
for (i = 0; i < n; i++){
scanf("%d", a + i);

if (a[i] < 0 || a[i] > 100){
printf("超出范围!\n");
exit(0);
}
}

Delete(a , n);

return 0;
}
</span>

三、总结;

1、先用一个统计数组统计原数组每个值,它的个数,还有它一共有多少的重     复值;

2、统计完后,传过来的数组就没用了,所以可以用它来存无重复值且有序的     数组的值;

3、当该数为1时,数组的长度不用减少;

4、当这组值为负数或者数值比较大时可以调整传过去的数组的地址来控制;

5、这种方法不太适合离散度特别大的数据;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐