针对一个由小到大有序的顺序表,用C语言编写程序,将其中的重复数据只保留一个,算法时间复杂度为O(n); 例如: 原始表为:3, 5, 5, 5, 5, 7, 8, 8, 8, 9, 9, 11 修改表为:3, 5, 7, 8, 9, 11
时间: 2024-06-12 13:08:42 浏览: 63
针对一个由小到大有序的顺序表,可以使用以下算法将其中的重复数据只保留一个,且时间复杂度为O(n):
1. 初始化两个指针,i和j,分别指向顺序表的第一个元素和第二个元素。
2. 当j小于等于顺序表长度时,执行以下步骤:
- 如果i指向的元素与j指向的元素相等,则j向后移动一位。
- 如果i指向的元素与j指向的元素不相等,则将j指向的元素复制到i的下一个位置,然后i和j同时向后移动一位。
3. 最后,将顺序表的长度更新为i的位置加1。
以上算法的思想是通过两个指针来遍历顺序表,当发现重复元素时,只保留一个,并将不重复的元素依次向前移动。
对于给定的例子,原始表为:3, 5, 5, 5, 5, 7, 8, 8, 8, 9, 9, 11。经过上述算法处理后,修改的表为:3, 5, 7, 8, 9, 11。
相关问题
用c语言编写算法:某顺序表L中存放整型数据,编写算法,在时间复杂度O(n) 、空间复度 O(1)内,对表L进行重新排序,将奇数全部放在前面,偶数全部放在后面。
可以使用双指针法,一个指针从表头开始,一个指针从表尾开始,分别向中间移动。当左指针指向偶数,右指针指向奇数时,交换两个数的位置。直到左指针和右指针相遇为止,即可完成表L的重新排序。这个算法的时间复杂度为O(n),空间复杂度为O(1)。
用C语言编写递归算法,从大到小输出给定二叉排序树中所有关键字不小于x的数据元素。要求你的算法的时间复杂度为O(log2n+m),其中n为排序树中所含结点数,m为输出的关键字个数。
以下是用C语言编写的递归算法:
```c
void printGreaterOrEqual(Node* root, int x) {
if (root == NULL) {
return;
}
if (root->data >= x) {
printGreaterOrEqual(root->right, x);
printf("%d ", root->data);
}
else {
printGreaterOrEqual(root->right, x);
printGreaterOrEqual(root->left, x);
}
}
```
其中,Node为二叉排序树的结点类型,data为结点中存储的关键字。算法的基本思想是,对于每个结点,先递归遍历其右子树,再输出该结点的关键字(因为右子树中的关键字一定不小于该结点的关键字),最后递归遍历其左子树(因为左子树中的关键字可能大于、等于或小于x)。这样可以保证输出的关键字是按照从大到小的顺序排列的。
算法的时间复杂度为O(log2n+m),其中log2n为遍历二叉排序树的时间复杂度,m为输出的关键字个数。
阅读全文