การเรียงลำดับการเลือกเป็นหนึ่งในอัลกอริธึมการเรียงลำดับที่ใช้ในการเรียงลำดับข้อมูลโดยวนซ้ำอาร์เรย์ตั้งแต่ต้น และแทนที่แต่ละองค์ประกอบด้วยองค์ประกอบที่เล็กที่สุดในรายการ ขณะที่เราก้าวไปข้างหน้า อาร์เรย์ด้านซ้ายจะถูกจัดเรียง และอาร์เรย์ด้านขวาจะไม่ได้รับการจัดเรียง การย้ายแต่ละครั้งจะวางตำแหน่งที่เล็กที่สุดถัดไปไปยังตำแหน่งปัจจุบันของดัชนีโดยสลับ
อัลกอริธึมการเรียงลำดับการเลือก
-
int arr[5]={ 5,4,2,1,3 };
-
int i, j;
-
ข้ามจากดัชนี i=0 ถึง i<ขนาดอาร์เรย์ -1
-
ข้ามจากดัชนี j=i+1 ไปยังขนาดอาร์เรย์ - 1
-
ค้นหาที่เล็กที่สุดและเก็บ index.pos
-
-
สลับองค์ประกอบที่ pos ดัชนีที่พบด้วย arr[i]
-
สิ้นสุด
การเรียงลำดับการเลือกแบบเรียกซ้ำ
-
ค้นหาดัชนีองค์ประกอบขั้นต่ำ
-
หากพบว่าดัชนีองค์ประกอบที่เล็กที่สุดเท่ากับขนาดอาร์เรย์ ให้ส่งคืน
-
มิฉะนั้น สลับองค์ประกอบปัจจุบันด้วยองค์ประกอบที่เล็กที่สุด
-
ทำซ้ำขั้นตอนข้างต้นสำหรับส่วนที่เหลือของอาร์เรย์โดยไม่รวมองค์ประกอบที่จัดเรียง
ตัวอย่าง
ป้อนข้อมูล − Arr[] ={ 5,7,2,3,1,4 }; ความยาว=6
ผลผลิต − เรียงลำดับอาร์เรย์:1 2 3 4 5 7
คำอธิบาย −
First Pass :- 5 7 2 3 1 4 → swap → 1 2 7 3 5 4 1 2 7 3 5 4 → no swap 1 2 7 3 5 4 → swap → 1 2 3 7 5 4 1 2 3 7 5 4 → swap → 1 2 3 4 5 7 1 2 3 4 5 7 → no swap
ป้อนข้อมูล − Arr[] ={ 1, 2, 3, 3, 2 };
ผลผลิต − เรียงลำดับอาร์เรย์:1 2 2 3 3
คำอธิบาย −
1 2 3 3 2 → no swap 1 2 3 2 3 → no swap 1 2 3 2 3 → swap → 1 2 2 3 3 1 2 2 3 3 → no swap
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางแบบเรียกซ้ำของการเรียงลำดับการเลือก กรณีฐานคือดัชนีต่ำสุด =ขนาดอาร์เรย์-1 มิฉะนั้นให้ค้นหาค่าต่ำสุดจากการสลับอาร์เรย์ด้วยดัชนีปัจจุบันและเรียงลำดับอาร์เรย์ที่ไม่เรียงลำดับทางขวาซ้ำ
-
ใช้อาร์เรย์อินพุต Arr[] และความยาวเป็นจำนวนองค์ประกอบในนั้น
-
ฟังก์ชัน findMin(int arr[], int i, int j) รับอาร์เรย์และดัชนีและส่งคืนดัชนีขององค์ประกอบขั้นต่ำระหว่าง arr[i+1] ถึง arr[j]
-
ใช้ค่าต่ำสุดของตัวแปร
-
หากทั้ง i และ j เหมือนกัน ให้คืนค่า i เป็นดัชนีขององค์ประกอบขั้นต่ำเนื่องจากทั้งคู่เหมือนกัน
-
มิฉะนั้น recursivley ให้มองหาตำแหน่ง i+1 ถึง j โดยใช้ minpos =findMin(arr, i + 1, j)
-
if(arr[i]
-
ฟังก์ชัน recurselectSort(int arr1[], int len1, int pos1) รับอาร์เรย์อินพุตและเรียงลำดับจากน้อยไปมากโดยใช้การเรียกซ้ำในการเรียงลำดับการเลือก
-
ถ้า pos1 ==len1 แล้วไม่พบขั้นต่ำ ให้ส่งคืน
-
ตั้งค่าอื่น minpos1 =findMin(arr1, pos1, len1-1)
-
หากดัชนี pos1 ปัจจุบันและดัชนีองค์ประกอบขั้นต่ำ minpos1 ไม่เหมือนกัน ให้สลับองค์ประกอบในดัชนีเหล่านี้โดยใช้ temp
-
เรียกซ้ำสำหรับส่วนที่เหลือของอาร์เรย์โดยใช้ recurselectSort(arr1, len1, pos1 + 1)
-
ในตอนท้ายของการโทรทั้งหมด เมื่อ len กลายเป็น 1 เราจะออกจากการเรียกซ้ำและอาร์เรย์จะถูกจัดเรียง
-
พิมพ์อาร์เรย์ที่เรียงลำดับภายใน main.
ตัวอย่าง
#include <iostream> using namespace std; int findMin(int arr[], int i, int j){ int minpos; if (i == j){ return i; } minpos = findMin(arr, i + 1, j); if(arr[i]<arr[minpos]){ minpos=i; } return (minpos); } void recurselectSort(int arr1[], int len1, int pos1){ int temp; int minpos1; if (pos1 == len1){ return; } minpos1 = findMin(arr1, pos1, len1-1); if (minpos1 != pos1){ temp=arr1[pos1]; arr1[pos1]=arr1[minpos1]; arr1[minpos1]=temp; } recurselectSort(arr1, len1, pos1 + 1); } int main(){ int Arr[] = {1,5,3,0,9,3,5}; int length = sizeof(Arr)/sizeof(Arr[0]); recurselectSort(Arr,length,0); cout<<"Sorted Array using recursive Selection sort: "<<endl; for (int i = 0; i<length ; i++){ cout << Arr[i] << " "; } return 0; }
ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
Sorted Array using recursive Selection sort: 0 1 3 3 5 5 9