529 字
3 分钟
【程序设计】数组双指针去重算法
引言
有一维数组如下 arr[10]={60,15,20,20,32,10,55,40,40,40}
有重复数字,如何去重?
思路
一 排序
为了能够利用数字之间规律去重,先将数字进行排序,我们可以采用从小到大排序更为方便。排序的方法有很多,这里用最基础的冒泡排序,即用两个循环,将最大的值不断往前排。
for (int i = 0; i < 10-1; i++) { for (int j = 0; j < 10 - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换相邻元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } }}
二 去重
排序后数组如下arr[10]={10,15,20,20,32,40,40,40,55,60}
可以看重复的数字会连续出现,利用这个规律,我们可以对数组中的数字两两进行对比:
- 10 和 15 不一样说明 10 没有重复,此时就可以把 10 放到 0 索引上,虽然形式上一样,但已经进行了代码操作;arr[10]={10,15,20,20,32,40,40,40,55,60}
- 15 和 20 不一样说明 15 没有重复,此时就可以把 15 放到 1 索引上,虽然形式上一样,但已经进行了代码操作,arr[10]={10,15,20,20,32,40,40,40,55,60}
- 20 和 20 一样说明重复了,无法确定后面还有没有,故不进行操作。arr[10]={10,15,20,20,32,40,40,40,55,60}
- 20 和 32 不一样结合前面一项对比说明 20 没有再重复了,此时的 20 就是最后一个 20,可以把 20 放到 3 索引上进行替换,形式上仍然一样。arr[10]={10,15,20,20,32,40,40,40,55,60}
- 32 和 40 不一样,故把 32 放在 4 索引上。arr[10]={10,15,20,32,32,40,40,40,55,60}
- 40 和 40 一样,跳过。
- 40 和 40 一样,跳过。
- 40 和 55 不一样,将 40 放在 5 索引 arr[10]={10,15,20,32,40,40,40,40,55,60}
- 55 和 60 不一样,将 55 放在 6 索引 arr[10]={10,15,20,32,40,55,40,40,55,60}
此时最后一个数字需要手动替换到 7 索引上,即arr[10]={10,15,20,32,40,55,60,40,55,60},另外还需要统计去重后有多少个数字,以方便遍历,重复的数字都堆到数组后边去了。
int j=0;for(int i=0;i<10,i++0{ if(arr[i]!=arr[i+1]{ arr[j]=arr[i]; j++; }};arr[j]=arr[9]该算法名中的指针并非为内存地址指针,而是利用两个索引变量,i 进行顺序遍历,j 进行重新排序。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
【程序设计】数组双指针去重算法
https://firefly.cuteleaf.cn/posts/程序设计/2025/c语言-数组双指针去重算法/ 最后更新于 2025-08-26,距今已过 206 天
部分内容可能已过时