ก่อนอื่นให้ใช้จำนวนเต็ม D1 ที่เล็กกว่า N เป็นการเพิ่มขึ้นครั้งแรกและแบ่งบันทึกทั้งหมดในไฟล์ออกเป็นกลุ่มของ D1 บันทึกทั้งหมดที่มีหลายระยะทาง DL จะถูกวางไว้ในกลุ่มเดียวกัน ขั้นแรกให้แทรกการเรียงลำดับในแต่ละกลุ่มโดยตรงจากนั้นใช้การเพิ่มขึ้นครั้งที่สอง D2 <D1 และทำซ้ำการจัดกลุ่มและการเรียงลำดับข้างต้นจนกระทั่งการเพิ่มขึ้น DT = 1 (DT <DT-L <; … <D2 <D1) นั่นคือนั่นคือ บันทึกทั้งหมดจะถูกวางไว้ในกลุ่มเดียวกันและจัดเรียงโดยตรง
วิธีนี้เป็นวิธีการแทรกการจัดกลุ่ม
แผนผัง:
รหัสต้นฉบับ
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.zc.manythread;
-
-
* @author ฉัน
-
-
Shellsort ชั้นเรียนสาธารณะ {
การนับ int คงที่สาธารณะ = 0;
public void void shellsort (int [] data) {
// คำนวณค่า H สูงสุด
int h = 1;
ในขณะที่ (h <= data.length / 3) {
H = H * 3 + 1;
-
ในขณะที่ (h> 0) {
สำหรับ (int i = h; i <data.length; i += h) {
if (data [i] <data [i - h]) {
int tmp = data [i];
int j = i - h;
ในขณะที่ (j> = 0 && data [j]> tmp) {
ข้อมูล [J + H] = ข้อมูล [J];
j -= h;
-
ข้อมูล [J + H] = TMP;
พิมพ์ (ข้อมูล);
-
-
// คำนวณค่า H ถัดไป
h = (h - 1) / 3;
-
-
Public Static Void Print (int [] data) {
สำหรับ (int i = 0; i <data.length; i ++) {
System.out.print (data [i] + "/t");
-
System.out.println ();
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
int [] data = new int [] {4, 3, 6, 2, 1, 9, 5, 8, 7};
พิมพ์ (ข้อมูล);
Shellsort (ข้อมูล);
พิมพ์ (ข้อมูล);
-
-
ผลการทำงาน:
การเรียงลำดับของเชลล์ไม่เสถียรค่าใช้จ่ายในพื้นที่ของมันคือ O (1) และค่าใช้จ่ายเวลาประมาณอยู่ระหว่าง O (N3/2) และ O (N7/6)