思路:如果找到一个需要删除的元素就立即删除,可能会造成许多元素被多次向前移动,时间复杂度为O(n2)。为了提高效率,可以设置两个下标变量si和di。si指向源,di指向目标。先是si向后移,直到si指向的数不在(x,y)的范围内。然后将源复制到目标,直到si指向的数在(x,y)的范围内。
时间复杂度:该每个元素都要检查一次,判断是否应该删除,最后情况下,第一个元素在(x,y)范围内,以后的元素都不在次范围内,此时需要移动n-1次,所以时间代价为O(n)。
程序代码:
void del_elem(PSeqList plist,int x,int y)
{
int si,di,n;
si = 0;
di = 0;
n = plist->n;
while(si<n)
{
while(si<n && plist->element[si]>x && plist->element[si]<y)
{
si++;
plist->n--;
}
while(si<n && (plist->element[si]<=x || plist->element[si]>=y))
{
if (si == di)
{
si++;
di++;
}
else
plist->element[di++] = plist->element[si++]
}
return plist;
}