Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C ลบสมาชิกซ้ำใน Array (Delete Duplicate Elements)

ลบค่าซ้ำใน Array ให้เหลือค่า Unique เท่านั้น (Preserve Order ของตัวแรกที่เจอ)

อัลกอริทึม (In-Place)

  1. Loop i = 0 ถึง n-1
  2. Loop j = i+1 ถึง n-1 (เช็คค่าซ้ำกับ a[i])
  3. ถ้าเจอ a[j] == a[i] → Shift ทุกตัวหลัง j ซ้าย 1 ตำแหน่ง
  4. ลด n ลง 1, ลด j ลง 1 (เช็คตำแหน่งเดิมอีกครั้ง)

โค้ดหลัก

for(i = 0; i < n; i++) {
    for(j = i + 1; j < n; j++) {
        if(a[i] == a[j]) {
            // Shift left
            for(k = j; k < n - 1; k++)
                a[k] = a[k + 1];
            n--;   // ลดขนาด Array
            j--;   // เช็ค Index เดิมอีกครั้ง (เพราะข้อมูลเลื่อนมา)
        }
    }
}

ตัวอย่างโปรแกรมครบถ้วน

#include <stdio.h>
#include <stdlib.h>

#define MAX 50

int main() {
    int a[MAX], n;
    
    printf("Enter array size: ");
    scanf("%d", &n);
    
    if(n <= 0 || n > MAX) {
        printf("Invalid size\n");
        return 1;
    }
    
    printf("Enter %d elements: ", n);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    
    printf("Original: ");
    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    
    // Remove duplicates
    for(int i = 0; i < n; i++) {
        for(int j = i + 1; j < n; j++) {
            if(a[i] == a[j]) {
                for(int k = j; k < n - 1; k++)
                    a[k] = a[k + 1];
                n--;
                j--;
            }
        }
    }
    
    printf("After removing duplicates: ");
    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    
    return 0;
}

ผลลัพธ์

Enter array size: 10
Enter 10 elements: 1 1 2 4 3 5 6 5 7 1
Original: 1 1 2 4 3 5 6 5 7 1
After removing duplicates: 1 2 4 3 5 6 7

วิธี Alternative: ใช้ Sorting + Unique (เร็วกว่า O(n log n))

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int a[] = {1, 1, 2, 4, 3, 5, 6, 5, 7, 1};
    int n = sizeof(a) / sizeof(a[0]);
    
    // 1. Sort
    qsort(a, n, sizeof(int), compare);
    // a = {1, 1, 1, 2, 3, 4, 5, 5, 6, 7}
    
    // 2. Unique (Copy non-duplicates to front)
    int j = 0;
    for(int i = 1; i < n; i++) {
        if(a[i] != a[j])
            a[++j] = a[i];
    }
    n = j + 1;  // New size
    
    printf("Sorted Unique: ");
    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    // Output: 1 2 3 4 5 6 7
    
    return 0;
}

เปรียบเทียบวิธี

วิธีTimeSpacePreserve Orderหมายเหตุ
Nested Loop (In-Place)O(n²)O(1)✅ ใช่Array เล็ก, ต้องรักษาลำดับ
Sort + UniqueO(n log n)O(1)❌ ไม่ (เรียงแล้ว)Array ใหญ่, เร็วกว่า
Hash Set (ถ้ามี)O(n)O(n)✅ ใช่C ต้อง Implement เอง