C语言实现对数组去重算法详解

介绍

在编程中,经常会遇到需要对数组进行去重的情况,即去除数组中重复的元素,使得每个元素都是唯一的。本文将详细解释一个用于去重的C语言函数,并逐步解释其中的每一部分。

代码解析

下面是用于去重的C语言函数:

c 复制代码
void removeDuplicates(int arr[], int *n) {
    int i, j, k;

    for (i = 0; i < *n; ++i) {
        for (j = i + 1; j < *n;) {
            if (arr[i] == arr[j]) {
                // 移动数组元素覆盖重复的元素
                for (k = j; k < *n - 1; ++k) {
                    arr[k] = arr[k + 1];
                }
                // 减少数组大小
                --(*n);
            } else {
                ++j;
            }
        }
    }
}

这个函数接受一个整型数组和该数组的大小(通过指针传递),然后修改原始数组,使其不包含重复的元素。接下来,我们将逐步解释这段代码的工作原理。

外层循环

c 复制代码
for (i = 0; i < *n; ++i) {

外层循环从数组的第一个元素开始,遍历到倒数第二个元素。i表示当前正在考虑的元素的索引。

内层循环

c 复制代码
for (j = i + 1; j < *n;) {

内层循环从外层循环的当前元素的下一个元素开始,遍历到数组的最后一个元素。j表示当前正在检查的元素的索引。

元素比较

c 复制代码
if (arr[i] == arr[j]) {

在内层循环中,我们检查当前元素arr[i]是否与后续元素arr[j]相等。

重复元素处理

c 复制代码
for (k = j; k < *n - 1; ++k) {
    arr[k] = arr[k + 1];
}

如果发现重复元素,就将数组中从arr[j]开始的元素逐个向前移动,覆盖掉重复的元素。这样,数组中的重复元素就被覆盖掉了。

数组大小减小

c 复制代码
--(*n);

每当覆盖一个重复元素后,数组的大小就减小1。这是通过修改传递进来的指针所指向的值来实现的。

内层循环控制

c 复制代码
++j;

如果没有发现重复元素,就将内层循环的控制变量j递增,继续比较下一个元素。

使用示例

c 复制代码
#include<stdio.h>
void removeDuplicates(int arr[], int *n) {
    int i, j, k;

    for (i = 0; i < *n; ++i) {
        for (j = i + 1; j < *n;) {
            if (arr[i] == arr[j]) {
                // 移动数组元素覆盖重复的元素
                for (k = j; k < *n - 1; ++k) {
                    arr[k] = arr[k + 1];
                }
                // 减少数组大小
                --(*n);
            } else {
                ++j;
            }
        }
    }
}

int main() {
    int all[] = {1, 2, 2, 3, 4, 4, 5};
    int n = sizeof(all) / sizeof(all[0]);

    // 调用去重函数
    removeDuplicates(all, &n);

    // 打印去重后的数组
    int i;
	for (i = 0; i < n; ++i) {
        printf("%d ", all[i]);
    }

    return 0;
}
bash 复制代码
1 2 3 4 5

通过上述的示例代码,我们可以清晰地看到该去重算法的工作过程。在示例中,原始数组为{1, 2, 2, 3, 4, 4, 5},去重后的结果为{1, 2, 3, 4, 5}

总结

这篇博客详细解释了一个用于数组去重的C语言函数。通过理解该算法,我们可以更好地处理数组中的重复元素,从而得到一个唯一元素构成的数组。这对于数据处理和算法实现都有着重要的意义。

相关推荐
bIo7lyA8v1 小时前
算法性能建模的数值方法与误差分析的技术8
算法
Smilecoc1 小时前
决策树(四):决策树实战之鸢尾花分类
算法·决策树·分类
-Thinker1 小时前
【无标题】
java·开发语言·算法·图搜索
数据仓库搬砖人1 小时前
DBSCAN 原理深度解析:从聚类算法到风控团伙识别的实战指南
算法
凡人叶枫1 小时前
Effective C++ 条款24:若所有参数皆须要类型转换,请为此采用 non-member 函数
linux·前端·c++·算法·嵌入式开发
洛水水1 小时前
【力扣100题】87.只出现一次的数字
数据结构·算法·leetcode
HZ·湘怡1 小时前
排序算法之希尔排序(2)--菜鸟先飞
数据结构·算法·排序算法·希尔排序
乐观勇敢坚强的老彭1 小时前
2026全国青少年信息素养大赛(Python小学组)复赛复习讲义
python·算法·数学建模
林间码客1 小时前
02数据挖掘:数据属性、类型与相似性度量
人工智能·算法·机器学习
阿标在干嘛1 小时前
从“拍脑袋”到“数据驱动”:政策平台的A/B测试实践
大数据·人工智能·算法·ab测试