2 顺序表元素的快速删除
作者: 冯向阳时间限制: 1S章节: 课程设计
问题描述 :
已知长度为n的线性表A采用顺序存储结构,请在应用顺序表ADT的基础上,设计一时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素。要求:线性表元素个数n很大,而值为item的数据元素个数很少,要求移动元素个数尽量少;删除后的数组元素与原数组元素不必保持顺序一致。
提示:算法参照快速排序的思想,使用两个指针,分别从左往右扫描找到需要被删除的元素、从右往左扫描找到不被删除的元素,然后交换。然后继续扫描。
参考函数原型:
//删除线性表中所有值为item的数据元素,时间复杂度为0(n)、空间复杂度为0(1)
template<class ElemType>
void DeleteItem( SqList<ElemType> &A, ElemType item );
输入说明 :
第一行:顺序表A的长度
第二行:顺序表A的数据元素(数据元素之间以空格分隔)
第三行:待删除数据元素
输出说明 :
第一行:删除前的顺序表遍历结果
空行
第二行:删除后的顺序表遍历结果(非空)
empty(空)(在本题目的前提条件下不应该出现,为保证算法的鲁棒性增加的测试数据)
输入:
40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 20 21 22 23 24 25 26 27 28 29 30 1 32 33 34 35 36 37 38 39 1
1
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 20 21 22 23 24 25 26 27 28 29 30 1 32 33 34 35 36 37 38 39 1
39 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 38 20 21 22 23 24 25 26 27 28 29 30 37 32 33 34 35 36
---------------------------------
#include<iostream>
using namespace std;
int main()
{
int arr[100000];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
int* p = arr;
int* p1 = arr + n - 1;
int number = 0;
cin >> number;
for (int i = 0; i < n; i++)
{
cout << arr[i];
cout << " ";
}
cout << endl;
cout << endl;
while (*p1 == number)
{
n--;
p1--;
}
if (n == 0)
{
cout << "empty" << endl;
}
while (&*p < &*p1)
{
if (*p == number)
{
*p = *p1;
p1--;
n--;
}
p++;
}
for (int i = 0; i < n; i++)
{
cout << arr[i];
cout << " ";
}
return 0;
}