删除数组中的指定元素

删除数组中的指定元素

删除数组中的某一元素会导致改位置空缺,需要将后面的依次往前移动。如果每删除一个元素就移动一次,时间复杂度较高。下面介绍三种时间复杂度为O(n)算法来进行删除操作及C++代码实现。

一、记录等于x的元素个数

用变量count记录数组中等于x的元素个数,边遍历数组边更新count并且进行前移,然后修改数组长度(使用“&”将修改带回来给实参的length)。

void del_x_1(int arr[],int &length,int x){
	int count=0;//等于x的元素个数 
	for(int i=0;i<length;i++){
		if(arr[i]==x){
			count++;
		}else{
			arr[i-count] = arr[i];
		}
	}
	length-=count;
}

二、记录不等于x的元素个数

用变量count记录数组中不等于的元素个数,也是删除后的元素个数,大体思想同上一种方法。因为count记录的信息不同,具体操作也有所不同。

void del_x_2(int arr[],int &length,int x){
	int count =0;//不等于x的元素个数 
	for(int i=0;i<length;i++){
		if(arr[i]!=x){
			arr[count++] = arr[i];
		}
	}
	length = count;
}

三、划分

利用快速排序划分的思想将数组分为不等于x和等于x的两部分。
划分图示

void del_x_3(int arr[],int &length,int x){
	int i=-1;
	for(int j=0;j<length;j++){
		if(arr[j]!=x){
			i++;
			swap(arr[i],arr[j]);//将j位置的元素放到不为x的区域 
		}
	}
	length = i+1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值