# การเรียงลำดับเชลล์

ประเภท Shellsort with gaps 23, 10, 4, 1 in action. Sorting algorithm Array O(n2) (worst known gap sequence)O(n log2n) (best known gap sequence)[1] O(n log n)[2] depends on gap sequence О(n) total, O(1) auxiliary .mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}

Shellsort หรือที่เรียกว่า Shell sort หรือ Shell's method คือการเปรียบเทียบการเปรียบเทียบในสถานที่ มันสามารถมองเห็นได้เป็นอย่างใดอย่างหนึ่งโดยทั่วไปของการเรียงลำดับโดยการแลกเปลี่ยน (bubble sort) หรือการเรียงลำดับโดยการแทรก (insertion sort) วิธีนี้เริ่มต้นด้วยการเรียงลำดับคู่ขององค์ประกอบที่ห่างกันซึ่งกันและกันแล้วค่อยลดช่องว่างระหว่างส่วนที่จะนำมาเปรียบเทียบ เริ่มต้นด้วยองค์ประกอบที่แยกออกจากกันทำให้สามารถเคลื่อนย้ายองค์ประกอบที่ไม่อยู่ในสถานที่ออกไปได้เร็วกว่าการแลกเปลี่ยนเพื่อนบ้านที่ใกล้ที่สุดเพียงอย่างเดียว โดนัลด์เชลล์ได้ตีพิมพ์ฉบับแรกในปีพศ. 2502 เวลาทำงานของ Shellsort ขึ้นอยู่กับลำดับช่องว่างที่ใช้มาก สำหรับตัวแปรที่เป็นประโยชน์หลายประการการกำหนดความซับซ้อนของเวลายังคงเป็นปัญหาที่เปิดอยู่

## ขั้นตอนการจัดเรียงแบบ Shellsort

• เลือก Gap ตัวแรก โดยเราจะใช้ค่าครึ่งหนึ่งของ ข้อมูล Gap สมมติว่า ข้อมูลมี 10 ตัว ครึ่งหนึ่งคือ 5สูตรคือ Gap = n/2 ดังนั้น 10/2 = 5 ให้ทำการเรียงข้อมูล Gap ชุดแรกให้เสร็จสิ้น จากนั้นทำการหาค่าข้อมูล Gap ตัวใหม่ ซึ่งก็ต้อง n/2 จะได้ว่า 5/2 = 3 (มีเศษให้ปัดขึ้น) ทำไปเรื่อยๆจน Gap = 1

ตัวอย่างการจัดเรียงแบบ Shellsort

a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
Input data 62 83 18 53 07 17 95 86 47 69 25 28
After 5-sorting 17 28 18 47 07 25 83 86 53 69 62 95
After 3-sorting 17 07 18 47 28 25 69 62 53 83 86 95
After 1-sorting 07 17 18 25 28 47 53 62 69 83 86 95

การเรียงลำดับครั้งแรกจะดำเนินการเรียงลำดับการแทรกในห้าอาร์เรย์ย่อย (a1, a6, a11), a1, a7, a3, ยกตัวอย่างเช่นมันจะเปลี่ยน อาร์เรย์ย่อย (a1, a6, a11) จาก (62, 17, 25) เป็น (17, 25, 62) การเรียงลำดับถัดไปจะเรียงลำดับตามรูปแบบ อาร์เรย์ย่อย สามชุด (a1, a4, a7, a10), (a2, a5, a8, a11), (a3, a6, a9, a12) รหัสผ่านสุดท้ายคือ 1-sorting คือการเรียงลำดับแบบธรรมดาของอาร์เรย์ทั้งหมด (a1, ... , a12)

เป็นตัวอย่างแสดงให้เห็นว่า อาร์เรย์ย่อย ที่ Shellsort ดำเนินการอยู่ในระยะแรกสั้น; ต่อมาพวกเขาจะยาว แต่เกือบจะสั่ง ในทั้งสองกรณีการจัดเรียงแทรกทำงานได้อย่างมีประสิทธิภาพ

Shellsort ไม่เสถียร: อาจเปลี่ยนแปลงลำดับขององค์ประกอบที่มีค่าเท่ากัน เป็นอัลกอริธึมการจัดเรียงแบบปรับตัวที่ทำงานได้เร็วขึ้นเมื่อป้อนข้อมูลบางส่วน

## อ้างอิง

1. Pratt, Vaughan Ronald (1979). Shellsort and Sorting Networks (Outstanding Dissertations in the Computer Sciences). Garland. ISBN 0-8240-4406-1.
2. "Shellsort & Comparisons". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2019-12-20. สืบค้นเมื่อ 2018-05-07.