Insertion Sort คือ?

Insertion Sort คือ?

Insertion Sort คือ?

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

หลักการทำงานของ Insertion Sort

ตัวอย่าง: 4 3 2 1 5 6 เรียงจากน้อยไปมาก

รอบที่ 1: เปรียบเทียบคู่แรกในอาร์เรย์ จะเห็นว่า 4 > 3 ให้ทำการสลับตำแหน่ง (Swap)
4 3 2 1 5 6 -> 3 4 2 1 5 6

รอบที่ 2: ตอนนี้มีสองตัวที่เรียงแล้วนั่นคือ 3 4 ให้เปรียบเทียบคู่ต่อมาคือ 4 กับ 2 จะเห็นว่า 4 > 2 ให้ทำการสลับ
3 4 2 1 5 6 -> 3 2 4 1 5 6
หลังจากสลับแล้ว จะเห็นได้ว่า 3 กับ 2 ยังไม่ถูกจัดเรียง จึงต้องสลับอีกครั้ง
3 2 4 1 5 6 -> 2 3 4 1 5 6

รอบที่ 3: เปรียบเทียบคู่ต่อมาคือ 4 กับ 1 จะเห็นว่า 4 > 1 ให้สลับตำแหน่ง
2 3 4 1 5 6 -> 2 3 1 4 5 6
จะเห็นได้ว่าอาร์เรย์ยังไม่ถูกจัดเรียง ดังนั้นจึงต้องสลับจนกว่า 1 จะอยู่ในตำแหน่งที่เหมาะสม 3 > 1 จึงสลับ
2 3 1 4 5 6 -> 2 1 3 4 5 6
2 > 1 จึงสลับ
2 1 3 4 5 6 -> 1 2 3 4 5 6

จะเห็นได้ว่าอาร์เรย์ถูกจัดเรียงสำเร็จแล้ว มองง่ายๆมันเหมือนกับการจั่วไพ่ขึ้นมาแล้วเอาไพ่ใบนั้นไปแทรกในตำแหน่งที่เหมาะสมที่สุดนั่นเอง

ตัวอย่างโค้ด Insertion Sort

#include <iostream>
using namespace std;

void insertionSort(int arr[], int n){
	int i, key, j;
	for (i = 1; i < n; i++)
	{
		key = arr[i];
		j = i - 1;
		while (j >= 0 && arr[j] > key)
		{
			arr[j + 1] = arr[j];
			j = j - 1;
		}
		arr[j + 1] = key;
	}
}

void printArray(int arr[], int n){
	int i;
	for (i = 0; i < n; i++)
		cout << arr[i] << " ";
	cout << endl;
}

int main(){
	int arr[] = { 12, 11, 13, 5, 6 };
	int N = sizeof(arr) / sizeof(arr[0]);
	insertionSort(arr, N);
	cout << "Sorted array: ";
	printArray(arr, N);
	return 0;
}

ผลลัพธ์:
Sorted array: 5 6 11 12 13

Time Complexity: O(N2)