c语言:针对一个由小到大有序的顺序表,编写程序将其中的重复数据只保留一个,算法时间复 杂度为 O(n); 例如: 原始表为:3, 5, 5, 5, 5, 7, 8, 8, 8, 9, 9, 11 修改表为:3, 5, 7, 8, 9, 11
时间: 2024-09-28 12:06:18 浏览: 27
数据结构各章节算法实现(C语言版).docx
5星 · 资源好评率100%
在 C 语言中,你可以使用一个简单的遍历和插入操作来解决这个问题,同时保持时间复杂度为 O(n)。这里是一个基本的算法描述:
1. 定义一个新数组 `result` 用于存放去重后的序列,它的初始长度设为原始数组的长度。
2. 创建两个指针,一个指向原数组 `original[]`,另一个指向结果数组 `result[]` 的末尾。
3. 遍历原数组 `original[]`:
a. 如果当前元素 `original[i]` 比 `result[result_len - 1]` 大,说明这是新的数值,不需要检查,直接将它添加到 `result` 并更新 `result_len`。
b. 否则,如果它们相等,则比较 `result[result_len - 1]` 和之前已存储的相同值的位置。如果这个位置是最后一个位置 `result_len - 1`,那就把原元素添加进去,因为这是第一次遇到该值;否则跳过此次循环,因为它已经存在。
4. 遍历结束后,所有非重复的元素都被添加到了 `result`。
以下是伪代码形式:
```c
result_len = original_length;
result = malloc(original_length * sizeof(int));
for (int i = 0; i < original_length; i++) {
int value = original[i];
if (value > result[result_len - 1]) {
result[result_len++] = value;
} else {
for (int j = 0; j < result_len - 1; j++) {
if (value == result[j]) break;
}
if (j == result_len - 1) {
result[result_len++] = value;
}
}
}
// 最后别忘了释放未使用的内存,这里是假设result数组足够大
free(original);
```
阅读全文