Shell Sort
Shell sort เป็นการพัฒนาวิธีการ sort จาก insertion sort ให้มีประสิทธิภาพในการ sort มากยิ่งขึ้น ด้วยการลดช่องว่างของการ sort ลง โดยแบ่งข้อมูลออกเป็นส่วน ๆ (segment) ในการ sort และทาการ sort ข้อมูลในแต่ละส่วน หลังจากนั้นก็ทาการแบ่งออกเป็นส่วน ๆ อีกโดยให้มีจานวนของ segment น้อยกว่าการแบ่งครั้งแรก ทากระบวนการดังกล่าวไปจนกว่าจานวนของ segment จะมีค่าเป็นหนึ่ง จึงยุติการ sort
หลังจากที่เราได้แบ่งข้อมูลออกเป็น 5 ส่วนดังที่เห็นในภาพ เราก็ทาการจัดเรียงข้อมูลในแต่ละส่วน
หลังจากการจัดเรียงข้อมูลเมื่อ segment เท่ากับ 5 ได้สิ้นสุดลงแล้ว เราจะทาการแบ่งข้อมูลออกเป็นส่วน ๆ อีก โดยคราวนี้เราจะแบ่งข้อมูลออกเป็น 3 ส่วน
เมื่อแบ่งข้อมูลได้แล้วเราก็ทาการจัดเรียงข้อมูลในแต่ละส่วน
และในที่สุดเราก็มาถึงขั้นตอนสุดท้ายคือ จานวนของ segment เหลือเพียงแค่ segment เดียว การจัดเรียงข้อมูลก็เกิดขึ้นภายใน segment นี้
Algorithms Shell Sort
public static <T extends Comparable<? super T>>
void shell (T[] arr) {
int i, j;
T temp;
//calculate increment value K (# of segments)
//based on Knuth's interval sequence
int k = 1;
while(k <= arr.length / 3)
k = k * 3 + 1; //1, 4, 13, 40, 121, ...
//sort array until # of segment is 1
while(k > 0) {
//sorting items in each segment simultanously
for(i = k; i < arr.length; i++) {
temp = arr[i];
j = i;
//one sub-pass; using j as index through items
//in each segment
while(j > k - 1 && arr[j-k].compareTo(temp) >= 0) {
arr[j] = arr[j - k];
j -= k;
}
arr[j] = temp;
}
k = (k - 1) / 3; //decreasing K value
}
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น