การจดเร ยงข อมล (Sorting)
วชา COSC2202 โครงสรางขอมล (Data Structure)
การจ ดเร ยงข อม ล (Sorting) การจดเรยงลำาดบ (Sorting) หมายถง การจดเรยงขอมลให
เรยงลำาดบตามเงอนไขทกำาหนดไว โดยอาจเรยงจากนอยไป มาก หรอคามากไปนอยกได การเรยงลำาดบขอมลในระบบ
คอมพวเตอร จะแบงเปน 2 ลกษณะใหญ ๆ คอ1. การเร ยงล ำาด บขอม ลภายใน (Internal sorting)
ใชกบขอมลทมจำานวนไมใหญกวาเนอทในหนวยความจำา (main memory)
ไมตองใชหนวยความจำาสำารอง เชน ดสก, เทป เปนตน2. การเร ยงล ำาด บขอม ลภายนอก (External sorting)
ใชกบขอมลทมจำานวนใหญเกนกวาทจะเกบลงในหนวยความจำาไดหมดภายในครงเดยว
จะใชหนวยความจำาภายนอก เชน ดสก, เทป สำาหรบเกบขอมล บางสวนทไดรบการเรยงลำาดบขอมลแลว แลวจงคอยจดการเรยง
ลำาดบขอมลในสวนตอไป
ประเภทของการเรยงลำาดบขอมล
หยบแทรก เลอกขอมลทตองการมา
แทรก
สลบทขอมลทไมถกตำาแหนง
Sort Order1. Ascending Order เรยง
จากนอย --> มาก2. Descending Order เรยง
จากมาก --> นอย
Insertion Sort การจดเรยงแบบแทรก คอ การเรยงขอมลโดยนำา
ขอมลทจะทำาการจดเรยงนนๆ ไปจดเรยงทละตวโดยการแทรกตวทจะเรยงไวในตำาแหนงทเหมาะสม
ของขอมลทมการจดเรยงเรยบรอยแลว ณ ตำาแหนงทถกตอง
Insertion Sortขนตอน เปรยบเทยบคากบตำาแหนงถด
ไปแทน สลบตำาแหนงใหอยในตำาแหนง
ทเหมาะสม
Shell Sort การจดเรยงแบบเชลล เปนการจดเรยงทอาศยเทคนค
การแบงขอมลออกเปนกลมยอยหลายๆ กลม แลวจด เรยงขอมลในกลมยอยๆ นน หลงจากนนกใหรวม
กลมยอยๆ ใหใหญขนเรอยๆ ขนสดทายใหจดเรยงขอมลทงหมดนนอกครง
Shell Sort ตวอยาง กำาหนด Segment เมอ K=3
Shell Sortขนตอน โดยทวไปการเลอกคา K ตวแรกมกจะเลอกใชคา
เทากบครงหนงของขอมล เชน ขอมลม 10 ตว K = n/2 = 10/2 = 5
เรยงขอมลทกตวใหเสรจสน แลวกำาหนดคา K ใหม( โดยทวไปจะเปนครงหนงของคา K ตวแรก เชน K1 = 5; K2 = 5/2 = 2)
ถา K > 1 ใหทำาซำา จนกระทงเหลอขอมลกลมเดยวถา K = 1 ใหเรยงลำาดบตามปกต
Shell Sort ตวอย างการทำางานในแตละรอบของ K
Shell Sort
Shell Sort
Selection Sort การจดเรยงแบบเลอก เปนวธการเรยงขอมลโดยจะ
เรมตนคนหาขอมลตวทนอยทสดจากขอมลทมอย ทงหมด แลวสลบทขอมลกบตวแรก แลวกลบไปหา
ขอมลตวทนอยทสดในกองตอไปสลบทกบขอมลจนกวาจะหมดกอง
Selection Sortขนตอน คนหาตวเลขทมคานอย/มาก
ทสดตงแตตวแรกไปจนถงตวสดทาย
สลบตำาแหนงตวเลขทมคานอย/มากทสด
Heap Sort
Heap Sort
Bubble Sort การจดเรยงแบบบบเบล เปนการจดเรยงโดยการ
เปรยบเทยบคา 2 คาทตดกน ทำาตอเนองกนไป เรอยๆ
Bubble Sort
Quick Sort การจดเรยงแบบควกซ ใชหลกการ divide-and-
conquer อาศยการจดแบงขอมลทงหมดออกเปน 2 กลม โดยกลมแรกจะเปนกลมของขอมลทมคานอย
กวาคากลางทกำาหนด และสวนทสองเปนกลมของ ขอมลทมคามากกวาคากลางทกำาหนด หลงจากนน
แบงขอมลแตละสวนออกเปน 2 สวนเชนเดม แบงไปเรอยๆจนไมสามารถแบงไดกจะไดขอมลทเรยงกน
Quick Sortขนตอน มการเลอกขอมลตวหนง
เรยกวา Pivot ทใชเปนตวแบงแยกชดขอมลทเราม
ออกเปนสวน คอ ขอมลทม คานอยกวา Pivot และ
ขอมลทมคามากกวา Pivot แบงขอมลไปเรอยๆ เรยงขอมลแตละสวนยอยๆ
>
>
>
Quick Sort การแบงสวนขอมลใชหลกการ Picking the pivot คอการ กำาหนดคาสมมตทอยตรงกลาง โดยจะเลอกขอมลท อยตรงกลางของขอมลทงหมด มาใชเปนคากงกลาง
ดงนน ขอมลอนๆทมคามากกวาคาทอยตรงกลางจะ อยกลมทางขวามอ คาทนอยกวาจะอยกลมทางซาย
มอ
Quick Sort
>
ถาขอมล < Pivot แลว
SortLeft=SortLeft+1
สลบ Pivot กบ
ขอมลตวท SortLeft-1
ถาขอมล >= Pivot แลว
SortRight=SortRight-1
Quick Sort
Merge Sort การเรยงแบบผสาน (Merge Sort ) -- การทำา
Merge Sort ใชหลกการ divide-and-conquer เหมอนกบ Quick Sort มลกษณะของการแบงขอมล
ออกเปนสวนๆ แตกระบวนการเรยงขอมลนนจะแตกตางไปจาก Quick sort Quick sort กระทำาการ
สลบขอมลไปพรอมกบการแบงขอมลออกเปนสวนๆ แต merge sort น กระทำาการแบงขอมลออกเปน
สวนๆกอน แลวคอยเรยงขอมลในสวนยอย จากนน นำาเอาขอมลสวนยอยทเรยงไวแลว มารวมกนและ
เรยงไปในเวลาเดยวกน อลกอรธมจะเรยงพรอมกบ ผสานขอมล เขาดวยกนจนกระทงขอมลทกตวรวม
กนกลายเปนขอมลเดยวอกครง
Merge Sort
แบงขอมลออกเปนขอมลยอยๆ
จดเรยงขอมลยอย
นำาขอมลยอยๆ นนมารวมกนใหเปนขอมลเดยว
Radix Sort การเรยงลำาดบแบบฐาน -- เปนการเรยงลำาดบโดยการพจารณา
ขอมลทละหลก1. เรมพจารณาจากหลกทมคานอยทสดกอน นนคอถาขอมล
เปนเลขจำานวนเตมจะพจารณาหลกหนวยกอน2. การจดเรยงจะนำาขอมลทละตว แลวนำาไปเกบไวทซงจดไว
สำาหรบคานน เปนกลมๆ ตามลำาดบการเขามา3. ในแตละรอบเมอจดกลมเรยบรอยแลว ใหรวบรวมขอมลจาก
ทกกลมเขาดวยกน โดยเรมเรยงจากกลมทมคานอยทสดกอน แลวเรยงไปเรอยๆ จนหมดทกกลม
4. ในรอบตอไปนำาขอมลทงหมดทไดจดเรยงในหลกหนวย เรยบรอยแลวมาพจารณาจดเรยงในหลกสบตอไป ทำาไป
เรอยๆ จนกระทงครบทกหลก
Radix Sort
ใชกบขอมล Linked List
การวดประสทธภาพ
Big-O
เปนตวบอกระดบความซบ
ซอนของอลกอรธมนน ซง
จะแสดงใหเหน
ประสทธภาพของอลกอรธ
มนน
Number of Loops
n Straight InsertionStraight Selection
Bubble
Shell HeapQuick
25 625 55 116100 10,000 316 664500 250,000 2,364 4,482
1,000 1,000,000 5,623 9,9652,000 4,000,000 13,374 10,985
การวดประสทธภาพvoid insertion_sort(int data[], int num_elts){ int i, j; for (i=0; i<num_elts; i++) for (j=i; (j>0) && (data[j] < data[j-1]); j--) swap(data, j, j-1);} /* insertion_sort */
void swap(int data[], int a, int b) { int temp;
temp = data[a];data[a] = data[b];data[b] = temp;
} /* swap */
Big-O = n2
การวดประสทธภาพvoid selection_sort(int data[], int num_elts){
int i, j, lowindex;
for (i=0; i<num_elts; i++) /* Select i'th record */{ lowindex = i; /* Remember its index */
for (j=num_elts-1; j>i; j--) /* Find the least value */ if (data[j] < data[lowindex])
lowindex = j; /* Put it in place */ if (i != lowindex) /* To reduce swap() operation */
swap(data, i, lowindex);}
} /* selection_sort */
void swap(int data[], int a, int b) { int temp;
temp = data[a];data[a] = data[b];data[b] = temp;
} /* swap */
Big-O = n2
การวดประสทธภาพvoid bubble_sort(int data[], int num_elts){
int i, j;
for (i=0; i<num_elts; i++) for (j=num_elts-1; j>i; j--)
if (data[j] < data[j-1]) swap(data, j, j-1);
} /* bubble_sort */
void swap(int data[], int a, int b) { int temp;
temp = data[a];data[a] = data[b];data[b] = temp;
} /* swap */
Big-O = n2
การวดประสทธภาพ
least significant digit (LSD) most significant digit (MSD)
k, the size of each key s, the chunk size used by the implementation.
การวดประสทธภาพ