0Pricing
C Academy · บทเรียน

การเรียงแบบฟองและแบบแทรก

การเรียงแบบง่าย

การเรียงแบบฟองและแบบแทรก เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

การเรียงลำดับแบบง่าย

การเรียงลำดับแบบฟองและการเรียงลำดับแบบแทรกเป็นการเรียงลำดับโดยเปรียบเทียบที่ง่ายที่สุดสองแบบ ทั้งคู่มีความซับซ้อน O(n ยกกำลังสอง) ในกรณีเลวร้ายที่สุด แต่เข้าใจง่ายและมีประโยชน์กับอาร์เรย์ขนาดเล็กหรือเกือบเรียงลำดับแล้ว

การทำงานของการเรียงลำดับแบบฟอง

การเรียงลำดับแบบฟองจะเดินผ่านอาร์เรย์ซ้ำ ๆ โดยสลับคู่ที่อยู่ติดกันและเรียงผิดลำดับ หลังจากเดินผ่านครบหนึ่งรอบ สมาชิกที่มีค่ามากที่สุดที่เหลืออยู่จะลอยขึ้นไปยังตำแหน่งสุดท้ายของตน

การสลับจำนวนเต็มสองตัว

ตัวช่วยการสลับที่นำกลับมาใช้ใหม่ได้ช่วยให้โค้ดการเรียงลำดับเป็นระเบียบ

#include <stdio.h>

void swap(int *a, int *b) {
    int t = *a; *a = *b; *b = t;
}

int main(void) {
    int x = 1, y = 2;
    swap(&x, &y);
    printf("%d %d\n", x, y);
    return 0;
}

การใช้งานการเรียงลำดับแบบฟอง

ใช้ลูปซ้อนกัน: ลูปภายนอกนับจำนวนรอบ ลูปภายในเปรียบเทียบคู่ที่อยู่ติดกันและสลับตำแหน่ง หลังรอบที่ i สมาชิก i ตัวสุดท้ายจะเรียงลำดับแล้ว

#include <stdio.h>

void bubble_sort(int a[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j + 1]) {
                int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
            }
}

int main(void) {
    int a[] = {5, 2, 9, 1, 3};
    bubble_sort(a, 5);
    for (int i = 0; i < 5; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

การปรับปรุงด้วยการหยุดก่อน

หากเดินผ่านครบหนึ่งรอบแล้วไม่มีการสลับ อาร์เรย์ก็เรียงลำดับแล้วและสามารถหยุดได้ วิธีนี้ทำให้การเรียงลำดับแบบฟองใช้เวลา O(n) กับข้อมูลนำเข้าที่เรียงลำดับอยู่แล้ว

#include <stdio.h>

void bubble_sort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int swapped = 0;
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j + 1]) {
                int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; swapped = 1;
            }
        if (!swapped) break;
    }
}

int main(void) {
    int a[] = {1, 2, 3, 4, 5};
    bubble_sort(a, 5);
    printf("sorted with early exit\n");
    return 0;
}

การทำงานของการเรียงลำดับแบบแทรก

การเรียงลำดับแบบแทรกจะสร้างส่วนที่เรียงลำดับแล้วไว้ด้านหน้า สำหรับสมาชิกใหม่แต่ละตัว จะเลื่อนสมาชิกที่มีค่ามากกว่าทั้งหมดไปทางขวา แล้ววางสมาชิกใหม่ลงในตำแหน่งที่เหมาะสม เช่นเดียวกับการเรียงไพ่ในมือ

การใช้งานการเรียงลำดับแบบแทรก

นำสมาชิก key = a[i] จากนั้นเลื่อนสมาชิกทุกตัวใน a[0..i-1] ที่มีค่ามากกว่าไปทางขวาหนึ่งช่อง แล้วแทรก key ลงในช่องว่าง

#include <stdio.h>

void insertion_sort(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int key = a[i];
        int j = i - 1;
        while (j >= 0 && a[j] > key) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = key;
    }
}

int main(void) {
    int a[] = {5, 2, 9, 1, 3};
    insertion_sort(a, 5);
    for (int i = 0; i < 5; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

การเรียงลำดับแบบแทรกกับข้อมูลที่เกือบเรียงลำดับแล้ว

การเรียงลำดับแบบแทรกทำงานได้ดีเมื่ออาร์เรย์เกือบเรียงลำดับแล้ว: สมาชิกแต่ละตัวจะเคลื่อนที่เพียงไม่กี่ตำแหน่ง ทำให้เข้าใกล้ O(n) นี่คือเหตุผลที่ใช้เป็นขั้นตอนสุดท้ายของการเรียงลำดับแบบผสม

#include <stdio.h>

void insertion_sort(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int key = a[i], j = i - 1;
        while (j >= 0 && a[j] > key) { a[j+1] = a[j]; j--; }
        a[j+1] = key;
    }
}

int main(void) {
    int a[] = {1, 2, 4, 3, 5}; /* one out of place */
    insertion_sort(a, 5);
    for (int i = 0; i < 5; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

ความคงเสถียร

การเรียงลำดับทั้งสองแบบมีความคงเสถียร: สมาชิกที่เท่ากันจะยังคงลำดับสัมพัทธ์เดิม เพราะจะสลับหรือเลื่อนเฉพาะเมื่อมีการเปรียบเทียบแบบมากกว่าอย่างเคร่งครัด ความคงเสถียรมีความสำคัญเมื่อเรียงระเบียนด้วยหลายคีย์

การเปรียบเทียบความซับซ้อน

ทั้งคู่มีค่าเฉลี่ยและกรณีเลวร้ายที่สุดเป็น O(n ยกกำลังสอง) แต่ในทางปฏิบัติแตกต่างกัน:

  • แบบฟอง: มีการสลับจำนวนมาก จึงไม่ค่อยใช้ในโค้ดจริง
  • แบบแทรก: เขียนข้อมูลน้อยกว่า เหมาะมากกับอาร์เรย์ขนาดเล็กหรือเกือบเรียงลำดับแล้ว

กรณีดีที่สุดของทั้งคู่เมื่อปรับปรุงแล้วคือ O(n)

การนับการดำเนินการ

มานับจำนวนการเปรียบเทียบที่การเรียงลำดับแบบแทรกทำกับอาร์เรย์ที่เรียงย้อนกลับ ซึ่งเป็นกรณีเลวร้ายที่สุด

#include <stdio.h>

int main(void) {
    int a[] = {5, 4, 3, 2, 1};
    int n = 5; long cmp = 0;
    for (int i = 1; i < n; i++) {
        int key = a[i], j = i - 1;
        while (j >= 0 && (cmp++, a[j] > key)) { a[j+1] = a[j]; j--; }
        a[j+1] = key;
    }
    printf("comparisons = %ld\n", cmp);
    return 0;
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการเรียงลำดับแบบง่าย

สรุปทบทวน

คุณได้เรียนรู้การเรียงลำดับแบบง่ายที่มีความซับซ้อน O(n ยกกำลังสอง) สองแบบ

  • การเรียงลำดับแบบฟองสลับคู่ที่อยู่ติดกันในแต่ละรอบ
  • การเรียงลำดับแบบแทรกเลื่อนและแทรกสมาชิกไว้ในส่วนด้านหน้าที่เรียงลำดับแล้ว
  • ทั้งคู่มีความคงเสถียร และทั้งคู่ทำเวลาได้ O(n) กับข้อมูลที่เรียงลำดับแล้วเมื่อปรับปรุงให้เหมาะสม
  • การเรียงลำดับแบบแทรกเป็นตัวเลือกที่ใช้งานได้จริงกว่าเมื่อข้อมูลมีขนาดเล็ก

คำถามที่พบบ่อย

บทเรียน “การเรียงแบบฟองและแบบแทรก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเรียงแบบฟองและแบบแทรก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเรียงแบบฟองและแบบแทรก”

การเรียงแบบง่าย คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การเรียงแบบฟองและแบบแทรก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียงแบบฟองและแบบแทรก
  2. Quicksort
  3. Mergesort
  4. การใช้ qsort
← กลับไปที่ C Academy