มีหลักการจัดเรียงเหมือนกับการเรียงไพ่ในมือ โดยจะรับไพ่มาทีละใบ เมื่อรับไพ่มาแล้วจะหาว่าไพ่ใบนั้นควรจะแทรกลงไปที่ช่องไหนในกองไพ่ที่อยู่ในมือดี สมมุติฐานคือ ไพ่ในมือจะต้องจัดเรียงไว้อยู่แล้ว อาจจะเรียงจากน้อยไปมาก หรือจากมากไปน้อยก็ได้ เมื่อรับไพ่มาจนครบทุกใบ ไพ่ทั้งหมดที่อยู่ในมือจะจัดเรียงกันอย่างถูกต้อง ตัวอย่างเช่นถ้าเรามีอะเรย์ขนาด 5 ช่องที่มีค่าเก็บอยู่ดังนี้

และถ้าเราต้องการจัดเรียงอะเรย์ a นี้ตามวิธีของ Insertion Sort จะเริ่มต้นโดยกำหนดให้มีตัวแปร i ชี้ไว้ที่ช่องที่เป็นไพ่ใบใหม่ที่รับเข้ามาในมือ

โดยเริ่มต้นรอบแรกสุด i = 0 จะมีภาพการทำงานดังนี้

รูปภาพ 1 รอบแรกสุดเมื่อ i = 0

และรอบต่อมาเมื่อ i = 1 จะมีภาพการทำงานดังนี้

รูปภาพ 2 รอบที่ 2 เมื่อ i = 1 (อ่านจากบนลงล่างและจากซ้ายไปขวา)

และรอบต่อมาเมื่อ i = 2 จะมีภาพการทำงานดังนี้

และรอบต่อมาเมื่อ i = 2 จะมีภาพการทำงานดังนี้

รูปภาพ 3 รอบที่ 3 เมื่อ i = 2 (อ่านจากบนลงล่างและจากซ้ายไปขวา)

และรอบต่อมาเมื่อ i = 3 จะมีภาพการทำงานดังนี้

รูปภาพ 4 รอบที่ 4 เมื่อ i = 3

และรอบสุดท้ายเมื่อ i = 4 จะมีภาพการทำงานดังนี้

รูปภาพ 5 รอบที่ 5 เมื่อ i = 4 (ภาพส่วนที่ 1 ต่อที่ภาพถัดไป)

เมื่อทำไปเรื่อยๆ จะได้ผลลัพธ์สุดท้ายดังนี้

รูปภาพ 6รอบที่ 5 เมื่อ i = 4 ผลลัพธ์สุดท้ายที่เกิดขึ้น

จากขั้นตอนที่อธิบายมาทั้งหมดสามารถเขียนเป็นโปรแกรม Java ได้ดังนี้

ซอร์สโค้ด 1 ไฟล์ InsertionSort.java แสดงวิธีการเขียนโปรแกรมเพื่อจัดเรียงแบบ Selection Sort

package aczept.examples.algorithm;

public class InsertionSort {
	public static void main(String[] args) {
		int[] a = { 4, 1, 3, 5, 2 };

		// i เริ่มที่ 1 เพราะตัวที่ 0 ถือว่าได้มาอยู่ในมือโดยไม่ต้องจัดเรียงใดๆ
		for (int i = 1; i < a.length; i++) {
			int tmp = a[i];
			int j = i - 1;

			// สแกนจากตัวที่ i - 1 ไปถึงตัวแรกสุด
			for (; j >= 0 && a[j] > tmp; j--) {
				a[j + 1] = a[j];
			}

			// เมื่อหยุดสแกนช่องที่ j + 1 คือจุดที่จะวางค่าลงไป
			a[j + 1] = tmp;
		}

		// พิมพ์ค่าออกมาดู
		print(a);
	}

	public static void print(int[] a) {
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
	}
}

ในกรณีที่ต้องการจัดเรียงค่าข้อมูลชนิดอะไรก็ได้ เราจำเป็นต้องใช้เทคนิค Generic ของ Java 5 ช่วยเล็กน้อย โดยเขียนโค้ดได้ใหม่เป็นดังนี้

ซอร์สโค้ด 2 ไฟล์ InsertionSortGeneric.java สำหรับการจัดเรียงชนิดข้อมูลใดๆก็ได้

package aczept.examples.algorithm;

public class InsertionSortGeneric {
	public static void main(String[] args) {
		Integer[] a = { 4, 1, 3, 5, 2 };
		sort(a);
		print(a);

		System.out.println();
		String[] b = { "Zeebra", "Cat", "Ant", "Dog" };
		sort(b);
		print(b);
	}

	public static <T extends Comparable<? super T>> void sort(T[] a) {
		// i เริ่มที่ 1 เพราะตัวที่ 0 ถือว่าได้มาอยู่ในมือโดยไม่ต้องจัดเรียงใดๆ
		for (int i = 1; i < a.length; i++) {
			T tmp = a[i];
			int j = i - 1;

			// สแกนจากตัวที่ i - 1 ไปถึงตัวแรกสุด
			for (; j >= 0 && a[j].compareTo(tmp) > 0; j--) {
				a[j + 1] = a[j];
			}

			// เมื่อหยุดสแกนช่องที่ j + 1 คือจุดที่จะวางค่าลงไป
			a[j + 1] = tmp;
		}
	}

	public static <T extends Comparable<? super T>> void print(T[] a) {
		for (int i = 0; i < a.length; i++)
			System.out.print(a[i] + " ");
	}
}

โปรแกรมสาธิตการจัดเรียงลำดับแบบ Insertion Sort

ท่านสามารถดาวน์โหลดโปรแกรมสาธิตการเรียงลำดับแบบ Insertion Sort ได้ที่ http://www.softwaredevelop.com/content.jsp?category=algorithm&name=InsertionSort เมื่อรันโปรแกรม DemoInsertionSortApp.java จะได้ผลลัพธ์ดังนี้

รูปภาพ 7 โปรแกรม DemoInsertionSortApp สำหรับศึกษาวิธีการจัดเรียงแบบ Insertion

ให้ทดลองกดปุ่ม Play Auto จะสังเกตเห็นความเปลี่ยนแปลง ของตัวแปรแต่ละตัว หรือกดปุ่ม Play เพื่อทดลองทำงานทีละขั้น

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *