ลบค่าซ้ำใน Array ให้เหลือค่า Unique เท่านั้น (Preserve Order ของตัวแรกที่เจอ)
อัลกอริทึม (In-Place)
- Loop i = 0 ถึง n-1
- Loop j = i+1 ถึง n-1 (เช็คค่าซ้ำกับ a[i])
- ถ้าเจอ a[j] == a[i] → Shift ทุกตัวหลัง j ซ้าย 1 ตำแหน่ง
- ลด 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;
}
เปรียบเทียบวิธี
| วิธี | Time | Space | Preserve Order | หมายเหตุ |
|---|---|---|---|---|
| Nested Loop (In-Place) | O(n²) | O(1) | ✅ ใช่ | Array เล็ก, ต้องรักษาลำดับ |
| Sort + Unique | O(n log n) | O(1) | ❌ ไม่ (เรียงแล้ว) | Array ใหญ่, เร็วกว่า |
| Hash Set (ถ้ามี) | O(n) | O(n) | ✅ ใช่ | C ต้อง Implement เอง |