Posted by Opie Eyek at 06:52 16 Juni 2009 Pengurutan seleksi (selection sort) mempunyai mekanisme seperti berikut : Mula-mula suatu penunjuk (diberi nama posAwal), yang menunjuk ke lokasi awal pengurutan data, diatur agar berisi indeks pertama dalam larik. Selanjutnya dicari bilangan terkecil yang terletak antara posisi sesudah yang ditunjuk oleh petunjuk tersebut hingga elemen yang terakhir dalam larik. Lokasi bilangan ini ditunjuk oleh posMin. Lalu tukarkan nilai bilangan terkecil tersebut dengan nilai yang ditunjuk posAwal. Proses seperti itu diulang dari posAwal bernilai 0 hingga n-2, dengan n menyatakan jumlah elemen dalam larik.
Algoritma :
SUBRUTIN selection_sort (L,n) UNTUK posAwal = 0 S/D n-2 PosMin posAwal UNTUK j posAwal + 1 S/D n-1 JIKA L [posMin] > L[j] MAKA PosMin j AKHIR JIKA AKHIR UNTUK //Tukarkan tmp L[posAwal] L[posAwal] L[posMin] AKHIR UNTUK AKHIR SUBRUTIN
void tampilkan_larik(int data[], int n) { int i; for (i=0;i<n;i++) cout<<data[i]<<" "; cout<<"\n"; }
http://allaboutalgoritma.blogspot.com/2009/06/metode-pengurutan-seleksiselection.html
Untuk mengurutkan sekumpulan bilangan, dapat dilakukan dengan berbagai cara (algoritma), misalnya bubble sort, selection sort, merge sort, quick sort. Di bawah ini akan dijelaskan cara mengurutkan sekumpulan bilangan menggunakan selection sort. Dalam selection sort ini kita memilih (select) bilangan terkecil, kemudian menempatkannya di awal. Kemudian memilih bilangan terkecil selanjutnya (terkecil kedua), dan menempatkannya di posisi setelah awal (posisi kedua). Berikutnya memilih bilangan terkecil ketiga, dan menempatkannya di posisi ketiga. Begitu seterusnya. Misalnya diberikan sekumpulan bilangan berikut: 3 8 5 7 2 3 6 8 0 4 1
Maka cara mengurutkannya seperti ini. Pertama, cari bilangan yang paling kecil dari paling kiri (posisi 1): 1 3 8 5 7 2 3 6 8 0 4 2
--------------------------------|
Pindahkan bilangan tersebut ke depan (posisi 1). Bilangan yang ada di posisi 1 tersebut dipindahkan ke posisi bilangan terkecil tadi (istilahnya swap = tukar tempat): [0] 8 5 7 2 3 6 8 [3] 4 1
Maka posisi 1 sudah berisi bilangan yang tepat. Selanjutnya, cari bilangan yang paling kecil berikutnya. Kali ini, tidak dari posisi 1 (karena di posisi tersebut sudah berisi bilangan yang tepat), tetapi cari dari posisi 2: 1 0 8 5 7 2 3 6 8 3 4 2
------------|
Maka posisi 2 sudah berisi bilangan yang tepat. Selanjutnya, cari bilangan yang paling kecil berikutnya. Kali ini, dari posisi 3:
1 2
------------|
Maka posisi 3 sudah berisi bilangan yang tepat. Selanjutnya cari bilangan yang paling kecil berikutnya dari posisi 4: 1 0 2 3 7 8 5 6 8 3 4 2
--------------------|
Kemudian swap: 0 2 3 1
[3]
[7]
--------------------|
Hasil swap: 0 2 1
[4]
[8]
5 |
Karena bilangan terkecil berikutnya sudah terletak di posisinya yang sesuai, maka tidak perlu dilakukan swap. Selanjutnya dari posisi 7: 1 0 2 3 3 4 2
6 |
1 2
8 |
Tidak perlu swap. Selanjutnya dari posisi 9 yang merupakan posisi terakhir. Setelah mencari bilangan terkecil dari posisi ini dan melakukan swap, kita tidak perlu melanjutkan pencarian ke posisi 10. Pada posisi tersebut sudah pasti berisi bilangan terbesar yang merupakan hasil swap-swap sebelumnya. 1 0 2 3 3 4 5 6 8 9 8 2
----|
Berikut adalah contoh implementasi algoritma di atas dalam bahasa C++: 1 #include <iostream> 2 3 4 5 6 7
cout << "N = "; int main() { int N; #include <cstdlib> using namespace std;
8 9 10 11 12 13 14 15
cin >> N;
int bilangan[N]; cout << "bilangan (pisah dgn spasi) = "; for (int i = 0; i < N; i++) { cin >> bilangan[i]; }
16 17 18 19 20
// selection sort for (int i = 0; i < N - 1; i++) { // cari yg paling minimum int posisiTerkecil = i; for (int j = i + 1; j < N; j++) { if (bilangan[j] < bilangan[posisiTerkecil]) {
21 22 23 24 25 26 27 28 29
} } }
posisiTerkecil = j;
// swap ke depan (kalo memang perlu dilakukan swap) if (posisiTerkecil != i) { int sementara = bilangan[i]; bilangan[i] = bilangan[posisiTerkecil]; bilangan[posisiTerkecil] = sementara;
30
}
31 32 33 34 35 36 37 38 39 40
} // system("pause"); cout << endl; } cout << "hasil = "; for (int i = 0; i < N; i++) { cout << bilangan[i] << " ";
41 42 43
5
{
6 7 8 9 10 11 12 13 14 15 16 17 18
System.out.print("bilangan (pisah dgn spasi) = "); int[] bilangan = new int[N]; for (int i = 0; i < N; i++) { bilangan[i] = sc.nextInt(); }
19 20 21
22 23 24 25 26 27
} }
posisiTerkecil = j;
28 29 30 31 32 33 34 35 36 37
} } } }
System.out.println();
38 39 40 41 42 43
}