删除无序数组中跳跃重复值并排序(时间复杂度为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、这种方法不太适合离散度特别大的数据;
一、问题描述;
现有一无序的数组(元素的离散度较小),要删除数组中的重复值,并排序,时间复杂度为线性阶,空间复杂度为常量阶。
二、代码;
/<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、这种方法不太适合离散度特别大的数据;
相关文章推荐
- 实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
- 1~n无序数组时间复杂度为O(n)排序
- C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序
- 对1...n,数组长度未知进行交换排序(无重复值,时间复杂度O(n), 空间复杂度O(1))
- 排序1,2......n的无序数组,时间复杂度为o(n),空间复杂度为o(1)
- 1~n无序数组时间复杂度为O(n)排序
- 删除重复的字符(给一个字符串,删除连续重复的字符,要求时间复杂度为O(1)……)
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 在已排序的数组中寻找和是给定值的两项,要求时间复杂度为O(n)
- 计蒜客 22题 排序后的数组删除重复数字
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)
- 有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
- 删除排序数组中重复的元素
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 时间复杂度为O(n)来判断数组a[N](1 <= a[i] <= N)中是否有重复元素 (某公司校园招聘笔试题目)