การเรียงแบบฟองและแบบแทรก
การเรียงแบบง่าย
การเรียงแบบฟองและแบบแทรก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงแบบฟองและแบบแทรก
- Quicksort
- Mergesort
- การใช้ qsort