编程语言应用

注册

 

发新话题 回复该主题

C语言实战编程去除数组重复值 [复制链接]

1#
北京治疗白癜风最好的专科医院 http://baidianfeng.39.net/a_zczz/250408/w2vdrgf.html

欢迎大家来到C语言实战编程系列,来看看怎么给一个数组去重;本文介绍两种C语言数组去重的算法,希望给大家带来思路。

算法1

给定要去重的数组记为array,计算出数组长度记为length,下面看实现步骤:

定义一个新数组new_array

循环数组array,如果当前的元素不在数组new_array中,则把元素存放在new_array中

为了使新数组中的元素连续,我们定义下标k,有新元素存放在new_array里时,k自增

在编程的时候我们会发现这个算法有明显的缺点:new_array初始值定义不能存在于原始数组中,否则按照算法去重后会丢失这个值,所以我们做一下改进把new_array的初始值变成array的第一个元素,k的初始值变为1:

intnew_array[20]={array[0]};intk=1;

但是还有一个问题:定义new_array数组长度必须大于等于原始数组array的长度,如果array是动态变化的,那这个问题就很麻烦了,所以此种算法有局限性。

算法2

这种算法的核心思想是:不重新定义新数组,直接改变原有array的元素。

循环array,从第一个元素开始,依次比较它后面第二个元素、第三个元素...末尾元素和它是否相同

加入第m个元素和第一个元素相同,则把它后面所有的元素往前移动一位,即array[m]=array[m+1];array[m+1]=array[m+2]...以此类推;这时候整个数组的排重范围就会缩小一位,因为第m个位置以后的元素都向前移动一位,达到挤掉当前重复元素(第m个元素)的目的

挤掉第m个元素后,第m+1个元素占了第m个元素的位置,所以还要从第m个元素开始继续向后比对,注意这个点也很关键,如果不重新冲第m个位置去比较,就会遗漏掉之前第m+1这个元素的去重比较。

比较完第一个元素后,同样的方式比较第二个...因为每一轮比较都可能出现重复的元素,所以最外层的循环结束位置也会不断的缩小——出现一个重复元素,范围减小1

这种算法相比上一种在算法理解上稍微难一些,但是比较完美的解决了问题,而且没有局限性,参考一下下核心代码:

源码

这里分享了两种C语言数组去重的算法思路,当然还有其他的方式方法实现,大家可以多去尝试,源码分享见评论。

分享 转发
TOP
发新话题 回复该主题