การจัดเรียงแบบหวี

การจัดเรียงข้อมูลแบบหวี (อังกฤษ: Comb sort) คือ การประยุกต์การจัดเรียงข้อมูลแบบ bubble sort เพื่อเพิ่มประสิทธิภาพในการทำงานได้เร็วขึ้นจะเป็นการการจัดเรียงข้อมูลเป็นคู่ใช้เปรียบเทียบโดยการหดตัวเข้าหากันเพื่อเปรียบเทียบค่าซึ่งจะมีความไวกว่า bubble sort และระยะในการหดตัวเข้าหากันเพื่อเปรียบเทียบนี้จะต้องนำจำนวนทั้งหมดของข้อมูลมาหารด้วย 1.3 ตลอดในการวนลูปจบแต่ละรอบเพื่อที่จะได้ระยะในการหดตัวเปรียบเทียบค่าใหม่ในรอบนั้น ๆ ถูกออกแบบเป็นครั้งแรกในปี คศ 1980 โดยคุณ Wlodzimierz Dobosiewicz  หลังจากนั้นได้ถูกปรับปรุงโดยคุณ Stephen lacey และ Richard Box
== หลักการทำงาน ==
การทำงานของบับเบิ้ลจะมีประสิทธิภาพในการทำงานได้ช้าเพราะต้องมีการสลับตำแหน่งข้อมูลอยู่บ่อยครั้ง (จะเรียกข้อมูลที่มีค่าน้อยอยู่ในตำแหน่งหลังๆ ของชุดข้อมูลว่า Turtle)  ดังนั้นการจัดเรียงข้อมูลแบบ comb ใช้หลักการขจัดตัว Turtle โดยมีการกำหนด Gap ขึ้นมาแล้วทำการเปรียบเทียบค่าในช่วงของ Gap จะไม่ใช้วิธีการเปรียบเทียบค่าที่อยู่ใกล้กันเหมือนกับวิธีการจัดเรียงแบบบับเบิ้ล ขั้นตอนการทำงานการจัดเรียงแบบ comb sort มีหลักการดังนี้
• ให้ value เป็นการนับจำนวนข้อมูลทั้งหมดใน array ว่ามีกี่ตัวและเก็บค่าไว้
• ทำการหาระยะในการเปรียบเทียบค่าโดยการนำจำนวน value มาหารด้วย 1.3
• วนลูปจนกว่าค่าของ value ที่ทำการหารมาในแต่ละรอบจะเป็น 1
• ให้ count ทำการวน loop for อีกครั้งเพื่อเปรียบเทียบค่าของข้อมูลตำแหน่งที่ 0 ถึง array_len - value เพื่อไม่ให้การเทียบข้อมูลอยู่ที่ตัวสุดท้ายของการเทียบพอดีไม่หลุดออกจากข้อมูล
• เช็คว่าตำแหน่ง index ที่วนลูปแต่ละครั้งมากกว่าตำแหน่งของ index บวกกับ value ที่หารมาในรอบนั้นไหมถ้ามากกว่าจะสลับกัน ทำจนกว่าค่า value ที่หารออกมาจะเท่ากับ 1 ก็จบการทำงานได้
== ขั้นตอนการทำ ==
1.คำนวณหาค่า Gap ระหว่างช่องที่จะเปรียบเทียบค่าโดยจะคำนวณหา Gap จาก Shink factor โดยคุณ Stephen lacey และ Richard Box แนะนำควรเป็น  1.3 มีที่มาจากสูตรดังนี้

2.ทำการวนลูปเพื่อเทียบค่าและสลับตำแหน่งของข้อมูล การทำงานในส่วนนี้จะคล้ายกับการจัดเรียงแบบบับเบิ้ลแต่ส่วนที่ต่างกันก็คือตำแหน่งการเปรียบเทียบค่า    การเทียบค่าการจัดเรียงข้อมูลแบบบับเบิ้ลจะเทียบค่าตำแหน่งที่ i กับ i+1 ซึ่งวิธีการแบบ comb จะเทียบตำแหน่งที i กับ i+gap โดยจะทำการเทียบค่าและสลับตำแหน่งข้อมูลที่ต้องการตามจำนวนสมาชิกในชุดข้อมูล  หลังจากนั้นจะคำนวณค่า gap ใหม่อีกครั้งและเช็คว่าค่า gap เป็นหนึ่งหรือไม่มีการการสลับตำแหน่งข้อมูลแล้ว จึงจะยุติการทำงาน ทำให้ได้ชุดข้อมูลที่มีการเรียงลำดับเรียบร้อย
=== ตัวอย่างการทำงาน ===
- กำหนดให้
- count คือ ตำแหน่ง loop การเทียบค่าของ 0 ถึง array_len – value
- array_len คือ ความยาวทั้งหมดของ array
- value คือ ค่าที่ถูกหารด้วย 1.3
- index คือ ตำแหน่งเปรียบเทียบของ count + value ที่การวนลูปแต่ล่ะรอบ
จะยกตัวอย่างจากข้อมูลง่ายๆ โดยให้ข้อมูลมีความยาวเท่ากับ 7 โดยเริ่มต้นจะให้
====== รอบที่ 0 ======
array_len = 7
value = 7
[ 9 , 18 , 15 , 20 , 0 , 3 , 7 ]
==== รอบที่ 1 ====
value = 7 // 1.3 => 5
count = 0 , 1
Index  = 5 , 6
[ 9 , 18 , 15 , 20 , 0 , 3 , 7 ]
[ 3 , 18 , 15 , 20 , 0 , 9 , 7 ]
[ 3 , 7 , 15 , 20 , 0 , 9 , 18 ]
==== รอบที่ 2 ====
value = 5 // 1.3 => 3
count = 0 , 1 , 2 , 3
Index =  3 , 4 , 5 , 6
[ 3 , 7 , 15 , 20 , 0 , 9 , 18 ]
[ 3 , 7 , 15 , 20 , 0 , 9 , 18 ]
[ 3 , 0 , 15 , 20 , 7 , 9 , 18 ]
[ 3 , 0 , 9 , 20 , 7 , 15 , 18 ]
[ 3 , 0 , 9 , 18 , 7 , 15 , 20 ]
==== รอบที่ 3 ====
value = 3 // 1.3 => 2
count = 0 , 1 , 2 , 3 ,  4
Index = 2 , 3 , 4 , 5 , 6
[ 3 , 0 , 9 , 18 , 7 , 15 , 20 ]
[ 3 , 0 , 9 , 18 , 7 , 15 , 20 ]
[ 3 , 0 , 9 , 18 , 7 , 15 , 20 ]
[ 3 , 0 , 7 , 18 , 9 , 15 , 20 ]
[ 3 , 0 , 7 , 15 , 9 , 18 , 20 ]
[ 3 , 0 , 7 , 15 , 9 , 18 , 20 ]
==== รอบที่ 4 ====
value = 2 // 1.3 => 1
count = 0 , 1 , 2 , 3 ,  4 , 5
Index = 1 , 2 , 3 , 4 , 5 ,  6
[ 3 , 0 , 7 , 15 , 9 , 18 , 20 ]
[ 0 , 3 , 7 , 15 , 9 , 18 , 20 ]
[ 0 , 3 , 7 , 15 , 9 , 18 , 20 ]
[ 0 , 3 , 7 , 15 , 9 , 18 , 20 ]
[ 0 , 3 , 7 , 9 , 15 , 18 , 20 ]
[ 0 , 3 , 7 , 9 , 15 , 18 , 20 ]
[ 0 , 3 , 7 , 9 , 15 , 18 , 20 ]
== Code ==
ตัวอย่างการเขียนโปรแกรมด้วย ภาษาไพทอน (Python)
def CombSort(array):
array_len = len(array)
value = len(array)
while value != 1 :
value = int(value // 1.3)
for count in range(0,array_len -value):
if array[count] >= array[count + value]:
array[count],array[count + value] = array[count + value], array[count]
return array
array = [9,18,15,20,0,3,7]
print(CombSort(array))
===== Big O =====
จาก Code ด้านบนจะมีการทำงานวนลูปจำนวน 2 ลูปคือลูป while และ for โดยในแต่ละลูปจะมีค่า Big O ดังนี้
while value != 1 : จะได้ => O(n)
for index in range(0,array_len - value): จะได้ => O(n)
ลูป for อยู่ในลูป while จะนำมาคูณกันได้สมการคำตอบคือ
>>> O(n) * O(n) = O(n2)
===== Best Case =====
เป็นกรณีที่จะทำงานแค่ 1 รอบหรือจำนวนของ array มีแค่ 1 ตัวทำให้ไม่ต้องเข้าลูป while จากนั้นจะ return ค่าของ array ออกมาได้เลย
Bio O จะเป็น  Big O => O(1)
===== Worst Case =====
เป็นกรณีที่ array มีจำนวนข้อมูลมากทำให้ต้องเข้าลูป while หลายครั้งจึงทำให้เวลาในการทำงานนานขึ้น ถ้าทำเสร็จแล้วให้ return ค่าออกมาและค่าที่ได้จะเรียงจากน้อยไปมากแล้ว
Big O จะเป็น  Big O => O(n^2)
== อ้างอิง ==
fadelc99. (2 สิงหาคม 2013) การจัดเรียงข้อมูลแบบคอมพ์ (Comb Sort). Retrieved 1 May 2018.
geeksforgeeks.  Comb Sort. Retrieved 28 April 2018.
Alban Maxhuni. (24 ธ.ค. 2013) comb sort example. Retrieved 28 April 2018.
ขั้นตอนวิธีการเรียงลำดับ