Pengertian Sorting pada C++
Salah satu bagian penting dari struktur data adalah proses pengurutan data. Data terkadang akan berada dalam bentuk yang tidak berpola ataupun dengan pola tertentu yang tidak kita inginkan. Namun dalam penggunaannya, kita akan selalu ingin menggunakan data tersebut dalam bentuk yang rapi atau berpola sesuai dengan yang kita inginkan. Maka dari itu proses sorting adalah proses yang sangat penting dalam struktur data. Proses pengurutan banyak ditemukan dalam pemrosesan komputer. Data yang sudah terurut memiliki beberapa keuntungan. Selain mempercepat pencarian, data yang sudah terurut juga dapat dengan mudah menentukan Nilai terbesar atau terkecil.
Pengurutan data memang sangat relevan dan merupakan aktivitas yang sangat penting berkaitan dengan pemrosesan data. Bahkan pengurutan data telah banyak dilakukan dengan bantuan alat. Adanya kebutuhan terhadap peroses pengurutan memunculkan bermacam-macam metode pengurutan yang bertujuan untuk memperoleh metode pengurutan yang optimal.
1. Definisi Sorting pada C++
Pengurutan (sorting) adalah proses mengatur sekumpulan objek menurut urutan atau susunan tertentu. Urutan objek tersebut dapat menaik (ascending), yaitu urutan objek yang disusun mulai dari Nilai terkecil hingga terbesar atau menurun (descending), yaitu urutan objek yang disusun mulai dari Nilai terbesar hingga terkecil. Jika N buah objek atau data disimpan di dalam array Nilai, maka pengurutan menaik berarti menyusun elemen array sedemikian sehingga:
NILAI[0] ≤ NILAI[1] ≤ NILAI[2] ≤ … ≤ NILAI[N-1]
Sedangkan pengurutan menurun berarti menyusun elemen array sedemikian sehingga:
NILAI[0] ≥ NILAI[1] ≥ … ≥ NILAI[N-1]
Data yang diurut dapat berupa data bertipe data dasar atau tipe data bentukan. Jika data bertipe bentukan (structure), maka harus disebutkan berdasarkan field apa data tersebut akan diurutkan.
Sama halnya dengan pencarian, pengurutan juga dibedakan menjadi dua kelompok, yaitu:
- Pengurutan Internal, yaitu pengurutan terhadap sekumpulan data yang disimpan di dalam memori komputere. Umumnya struktur internal yang dipakai untuk pengurutan ini adalah array, sehingga pengurutan internal disebut dengan pengurutan array.
- Pengurutan Eksternal, yaitu pengurutan data yang disimpan di dalam memori sekunder. Biasanya data dengan berjumlah besar sehingga tidak mampu dimuat semuanya dalam memori komputer. Struktur eksternal yang dipakai adalah arsip (file), maka pengurutan ini juga sering disebut dengan pengurutan arsip.
Baca juga : Pengertian dan Contoh Program Array pada C++
Karena pengaksesan memori utama lebih cepat dari pada pengaksesan memori sekunder, maka pengurutan internal lebih cepat dibanding dengan pengurutan eksternal.
- Bubble Sort
- Selection Sort
- Quick Sort
- Merge Sort
- Heap Sort
- Shell Sort
- Radix Sort
- Tree Sort
- Maximum Sort
- Insertion Sort
Banyaknya metode pengurutan yang tersedia menimbulkan pertanyaan: algoritma manakah yang memiliki kinerja yang baik? Kinerja pengurutan data sangat menentukan kinerja sistem, karena itu pemilihan metode pengurutan yang cocok akan berperan dalam suatu aplikasi. Metode pengurutan yang akan dibahas adalah metode pengurutan Bubble Sort, Quick Sort, Maximum/Minimum Sort, Shell Sort, Merge Sort, dan Insertion.
2. Bubble Sort
Bubble Sort adalah metode yang membandingkan elemen yang sekarang dengan elemen-elemen berikutnya. Pembandingan elemen dapat dimulai dari awal atau mulai dari paling akhir. Apabila elemen yang sekarang lebih besar (untuk urut menaik) atau lebih kecil (untuk urut menaik) dari elemen berikutnya, maka posisinya ditukar, tetapi jika tidak maka posisinya tetap.
Contoh : Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Bubble Sort: 25, 71, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya yang dimulai dari belakang seperti berikut dan programnya dapat dilihat pada program Lat_Sorting_01a.
Perhatikan contoh pengurutan yang diperagakan di atas bahwa pada langkah 4 telah terurut, maka sebenarnya proses sudah dapat dihentikan. Untuk mengatasi hal itu dalam program Lat_Sorting_01b digunakan variabel bertipe Boolean. Demikian juga halnya pengurutan secara menaik di atas tetap menggunakan variabel bertipe Boolean untuk mengatasi hal yang sama.
/* Program Pengurutan Metode Bubble Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_01a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, k, N; int temp; bool tukar; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan i=0; tukar = true; while ((i<=N-2) && (tukar)) { tukar = false; for(j=N-1; j>=i+1; j--) { if(Nilai[j] < Nilai[j-1]) { { temp = Nilai[j]; Nilai[j] = Nilai[j-1]; Nilai[j-1] = temp; tukar = true; cout<<"\nUntuk j = " <<j<<" : "; for(k=0; k<N; k++) cout<<set(3)<<Nilai[k]; } } i++; } //Proses Cetak Setelah diurutkan cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
3. Quick Sort
Quick Sort merupakan metode tercepat dalam proses pengurutan data dengan menggunakan prinsip rekursif. Metode ini menggunakan strategi “pecah-belah” dengan mekanisme berikut ini.
Misalkan kita mempunyai array Nilai[k..l]. Array dipartisi menjadi dua bagian array kiri Nilai[k..m] dan array kanan Nilai[m+1..l]. Dasar mempartisi array menjadi dua adalah dengan mengambil elemen pertama sebagai elemen pivot. Letakkan semua elemen array yang lebih kecil dari pivot ke sebelah pivot dan semua elemen array yang lebih besar dari pivot ke sebelah kanan pivot. Elemen-elemen yang di sebelah kiri elemen pivot merupakan elemen-elemen array Nilai[k..m] sedangkan elemen-elemen array Nilai[m+2..l] adalah semua elemen yang lebih besar dari pivot. Lakukan hal yang sama seperti di atas terhadap array Nilai[k..m] dan Nilai[m+1..l] hingga tidak dapat dipartisi lagi.
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Maximum Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut dan programnya dapat dilihat pada program Lat_Sorting_02a.
- Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
- Gunakan array Nilai[0..2]. Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
Perhatikan array Nilai[2] tidak dapat lagi dipartisi maka berhenti sampai disana.
- Gunakan array Nilai[0..1]. Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
Perhatikan array Nilai[0] dan Nilai[1] tidak dapat lagi dipartisi maka berhenti sampai di sana.
- Gunakan array Nilai[4..7]. Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
- Gunakan array Nilai[4..6]. Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
- Gunakan array Nilai[5..6]. Ambil elemen pertama sebagai elemen pivot, letakkan semua elemen array yang lebih kecil dari pivot ke sebelah kiri elemen pivot dan letakkan semua elemen array yang lebih besar dari pivot ke sebelah kanan elemen pivot.
Karena semua elemen array sudah tidak dapat dipartisi maka proses pengurutan berakhir dan hasilnya diperoleh seperti berikut (gabungkan mulai Nilai[0] hingga Nilai[7]):
Untuk melakukan proses pengurutan data secara menurun dengan metode Quick Sort dilakukan dengan meletakkan semua elemen array yang lebih kecil dari pivot ke sebelah kanan pivot dan semua elemen array yang lebih besar dari pivot ke sebelah kiri pivot.
/* Program Pengurutan Metode Quick Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_02a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void Cetak(int data[], int n) { int i; for(i=0; i<n; i++) cout<<setw(3)<<data[i]; cout<<"\n"; } int Partisi(int data[], int p, int r) { int x, i, j, temp; x = data[p]; i=p; j=r; while(l) { while(data[j]>x) j--; while(data[i]<x) i++; if(i<j) { temp = data[i]; data[i] = data[j]; data[j] = temp; } else return j; } } void Quick_Sort(int data[], int p, int r) { int q; if(p<r) { q=Partisi(data, p, r+1); Quick_Sort(data, p, 1); Quick_Sort(data, q+1, r); } } void main() { int Nilai[20]; int i, N; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } cout<<"\nData Sebelum di urut : "; Cetak(Nilai, N); cout<<endl; Quick_Sort(Nilai, 0, N-1); cout<<"\nData Setelah di urut : "; Cetak(Nilai,N); getch(); }
4. Metode Maximum/Minimum Sort
Metode Maximum/Minimum Sort dilakukan berdasarkan pemilihan elemen maksimum/minimum, maka metode ini disebut juga dengan metode pemilihan/seleksi (Selection Sort).
4.1 Metode Maximum Sort
Metode ini disebut dengan metode Maximum karena didasarkan pada pemilihan elemen maksimum sebagai dasar pengurutan. Konsepnya adalah memilih elemen maksimum kemudian mempertukarkan elemen maksimum tersebut dengan elemen paling akhir untuk urut menaik dan elemen pertama untuk urut menurun. Selanjutnya elemen paling akhir/awal tersebut di-“isolasi”, artinya elemen tersebut tidak disertakan lagi untuk tahapan berikutnya. Proses yang sama dilakukan kembali terhadap elemen array yang tersisa, yaitu memilih elemen maksimum kemudian mempertukarkan elemen maksimum tersebut dengan elemen paling akhir/awal dari array yang tersisa tadi. Kemudian diisolasi kembali. Demikian seterusnya hingga semua elemen terurut.
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Maximum Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut dan programnya dapat dilihat pada program Lat_Sorting_04a.
Langkah -1: Cari elemen maksimum di dalam array Nilai[0..7] → Nilai[1]=72 kemudian tukarkan dengan elemen array paling akhir Nilai[7] sehingga diperoleh array:
Langkah -2: Cari elemen maksimum di dalam array yang tersisa Nilai[1..7] → Nilai[1]=50 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[6] sehingga diperoleh array:
Langkah -3: Cari elemen maksimum di dalam array yang tersisa Nilai[2..7] → Nilai[3]=45 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[5] sehingga diperoleh array:
Langkah -4: Cari elemen maksimum di dalam array yang tersisa Nilai[3..7] → Nilai[2]=30 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[4] sehingga diperoleh array:
Langkah -5: Cari elemen maksimum di dalam array yang tersisa Nilai[4..7] → Nilai[0]=25 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[3] sehingga diperoleh array:
Langkah -6: Cari elemen maksimum di dalam array yang tersisa Nilai[5..7] → Nilai[2]=20 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[2], sehingga diperoleh array:
Langkah -7: Cari elemen maksimum di dalam array yang tersisa Nilai[6..7] → Nilai[0]=15 kemudian tukarkan dengan elemen paling akhir array yang tersisa Nilai[1], sehingga diperoleh array:
Selesai. Dan array telah terurut secara menarik. Program mengurutkan secara menaik dengan metode Maximum Sort dapat dilihat pada program Lat_Sorting_04a.
/* Program Pengurutan Metode Maximum Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_04a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, N, l; int temp, U, Imaks; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan U=N-1; for(i=0; i<=N-2; i++) { Imaks = 0; for(j=1; j<=U; j++) { if(Nilai[j] > Nilai[Imaks]) Imaks = j; } temp = Nilai[U]; Nilai[U] = Nilai[Imaks]; Nilai[Imaks] = temp; U--; cout<<endl; for(l=0; l<N; l++) cout<<setw(3)<<Nilai[l]; } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
Langkah -1: Cari elemen maksimum di dalam array Nilai[0..7] → Nilai[1]=72 kemudian tukarkan dengan elemen pertama array Nilai[0]=25 sehingga diperoleh array:
Langkah -2: Cari elemen maksimum di dalam array yang tersisa Nilai[1..7] → Nilai[7]=50 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[1]=25 sehingga diperoleh array:
Langkah -3: Cari elemen maksimum di dalam array yang tersisa Nilai[2..7] → Nilai[3]=45 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[2]=30 sehingga diperoleh array:
Langkah -4: Cari elemen maksimum di dalam array yang tersisa Nilai[3..7] →Nilai[3]=3- kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[3]=30 sehingga diperoleh array:
Langkah -5: Cari elemen maksimum di dalam array yang tersisa Nilai[4..7] → Nilai[7]=35 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[4]=30 sehingga diperoleh array:
Langkah -6: Cari elemen maksimum di dalam array yang tersisa Nilai[5..7] → Nilai[7]=20 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[5]=15 sehingga diperoleh array:
Langkah -7: Cari elemen maksimum di dalam array yang tersisa Nilai[6..7] → Nilai[7]=15 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[6]=6 sehingga diperoleh array:
Selesai. Dan array telah terurut secara menurun. Program mengurutkan secara menurun dengan metode Maximum Sort dapat dilihat pada program Lat_Sorting_04b.
/* Program Pengurutan Metode Maximum Sort Pengurutan Secara Menurun Nama File : Lat_Sorting_04b */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, N, l; int temp, U, Imaks; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan U=N-1; for(i=0; i<=N-2; i++) { Imaks = i; for(j=i+1; j<=U; j++) { if(Nilai[j] > Nilai[Imaks]) Imaks = j; } temp = Nilai[i]; Nilai[i] = Nilai[Imaks]; Nilai[Imaks] = temp; cout<<endl; for(l=0; l<N; l++) cout<<setw(3)<<Nilai[l]; } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
4.2. Metode Minimum Sort
Metode ini disebut dengan metode minimum karena didasarkan pada pemilihan elemen minimum sebagai dasar pengurutan. Konsepnya adalah memilih elemen minimum kemudian mempertukarkan elemen minimum tersebut dengan elemen paling akhir untuk urut menaik dan elemen pertama untuk urut menurun. Selanjutnya elemen paling akhir/pertama tersebut di “isolasi” artinya elemen tersebut tidak disertakan lagi untuk tahapan berikutnya. Proses yang sama dilakukan kembali terhadap elemen array yang tersisa, yaitu memilih elemen minimum kemudian mempertukarkan elemen minimum tersebut dengan elemen paling akhir/pertama dari array yang tersisa tadi. Kemudian diisolasi kembali. Demikian seterusnya hingga semua elemen terurut.
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Minimum Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut dan programnya dapat dilihat pada program Lat_Sorting_05a.
Langkah -2: Cari elemen minimum di dalam array Nilai[1..7] → Nilai[5]=15 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[1]=72 sehingga diperoleh array:
Langkah -3: Cari elemen minimum di dalam array Nilai[2..7] → Nilai[4]=2- kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[2]=30 sehingga diperoleh array:
Langkah -4: Cari elemen minimum di dalam array Nilai[3..7] → Nilai[6]=25 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[3]=45 sehingga diperoleh array:
Langkah -5: Cari elemen minimum di dalam array Nilai[4..7] → Nilai[4]=30 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[4]=30 sehingga diperoleh array:
Langkah -6: Cari elemen minimum di dalam array Nilai[5..7] → Nilai[6]=45 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[5]=72 sehingga diperoleh array:
Langkah -7: Cari elemen minimum di dalam array Nilai[6..7] → Nilai[7]=50 kemudian tukarkan dengan elemen pertama array yang tersisa Nilai[6]=72 sehingga diperoleh array:
/* Program Pengurutan Metode Minimum Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_05a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, N, l; int temp, Imin; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan for(i=0; i<=N-2; i++) { Imin = i; for(j=i+1; j<N; j++) { if(Nilai[j] < Nilai[Imin]); Imin = j; } temp = Nilai[i]; Nilai[i] = Nilai[Imin]; Nilai[Imin] = temp; cout<<endl; for(l=0; l<N; l++) cout<<setw(3)<<Nilai(l); } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menurun dengan metode Minimum Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut dan programnya dapat dilihat pada program Lat_Sorting_05b.
Langkah -1: Cari elemen minimum di dalam array Nilai[0..7] → Nilai[6]=6 kemudian tukarkan dengan elemen terakhir array Nilai[7]=50 sehingga diperoleh array:
Langkah -2: Cari elemen minimum di dalam array yang tersisa Nilai[0..6] → Nilai[5]=15 kemudian tukarkan dengan elemen terakhir array yang tersisa Nilai[6]=50 sehingga diperoleh array:
Langkah -3: Cari elemen minimum di dalam array yang tersisa Nilai[0..5] → Nilai[4]=20 kemudian tukarkan dengan elemen terakhir array yang tersisa Nilai[5]=50 sehingga diperoleh array:
Langkah -4: Cari elemen minimum di dalam array yang tersisa Nilai[0..4] → Nilai[0]=25 kemudian tukarkan dengan elemen terakhir array yang tersisa Nilai[4]=50 sehingga diperoleh array:
Langkah -6: Cari elemen minimum di dalam array yang tersisa Nilai[0..2] → Nilai[2]=45 kemudian tukarkan dengan elemen terakhir array yang tersisa Nilai[2]=45 sehingga diperoleh array:
Langkah -7: Cari elemen minimum di dalam array yang tersisa Nilai[0..1] → Nilai[0]=50 kemudian tukarkan dengan elemen terakhir array yang tersisa Nilai[1]=72 sehingga diperoleh array:
Selesai. Dan array terurut secara menurun. Program mengurutakan secara menurun dengan metode Minimum Sort dapat dilihat pada program Lat_Sorting_05b.
/* Program Pengurutan Metode Minimum Sort Pengurutan Secara Menurun Nama File : Lat_Sorting_05b */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, N, l; int temp, U, Imin; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan U=N-1; for(i=0; i<=N-2; i++) { Imin = 0; for(j=1; j<=U; j++) { if(Nilai[j] < Nilai[Imin]) Imin = j; } temp = Nilai[U]; Nilai[U] = Nilai[Imin]; Nilai[Imin] = temp; cout<<endl; U--; for(l=0; l<N; l++) cout<<setw(3)<<Nilai[l]; } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i] getch(); }
5. Metode Shell Sort
Metode ini dinamakan sesuai dengan penciptanya, yaitu D.L. Shell. Metode ini mirip dengan metode Bubble Sort, hanya saja perbandingan dilakukan bukan antara dua bilangan yang berurutan, akan tetapi antara dua bilangan dengan jarak tertentu. Jarak ditentukan dengan N Div 2, dimana N adalah banyaknya elemen array. Lakukan pertukaran tempat jika setiap kali perbandingan dipenuhi (lebih besar untuk urut menaik dan lebih kecil untuk urut menurun). Setiap kali perbandingan terhadap keseluruhan elemen selesai dilakukan, maka perbandingan yang baru dilakukan kembali dimana jarak diperoleh dengan Jarak Div 2 (jarak diperoleh dari Nilai jarak sebelumnya). Perbandingan keseluruhan dilakukan sampai Nilai jarak sama dengan 1 (satu). Pada saat jarak berNilai 1, maka metode Shell Sort sama dengan metode Bubble Sort.
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Shell Sort: 25, 72, 30, 45, 20, 15, 6, 59. Urutan langkah pengurutannya seperti berikut.
Karena Nilai K masih sama dengan 4 dan Nilai C=1, maka lakukan kembali proses perbandingan dengan menghitung Nilai jarak (K) sama dengan 4 div 2 =2 dan membuat Nilai C=0, sekarang proses perbandingan dilakukan berturut-turut antara Nilai[0] dengan Nilai[2], jika Nilai[0]>Nilai[2] maka lakukan pertukaran tempat dan jika tidak lanjutkan terhadap Nilai[1] dengan Nilai[3], jika Nilai[1]>Nilai[3] maka lakukan pertukaran tempat dan jika tidak lanjutkan terhadap Nilai[2] dengan Nilai[4], jika Nilai[2]>Nilai[4] maka lakukan pertukaran tempat dan jika tidak lanjutkan terhadap Nilai[3] dengan Nilai[5], jika Nilai[3]>Nilai[5] maka lakukan pertukaran dan jika tidak lanjutkan terhadap Nilai[4] dengan Nilai[6], jika Nilai[4]>Nilai[6] maka lakukan pertukaran dan jika tidak lanjutkan terhadap Nilai[5] dengan Nilai[7], jika Nilai[5]>Nilai[7] maka lakukan pertukaran tempat kemudian Nilai C=1.
Karena Nilai K masih sama dengan 2 dan Nilai C=1, maka lakukan kembali proses perbandingan dengan menghitung Nilai jarak(K) sama dengan 2 div 2 = 1 dan membuat Nilai C=0, sekarang proses perbandingan dilakukan berturut-turut antara Nilai[0] dengan Nilai[1], Nilai[1] dengan Nilai[2], Nilai[2] dengan Nilai[3], Nilai[3] dengan Nilai[4], Nilai[4] dengan Nilai[5], Nilai[5] dengan Nilai[6], dan Nilai[6]>Nilai[7], kemudian Nilai C=1 akan diperoleh hasil pertukaran setelah perbandingan seperti berikut.
6 15 20 25 45 30 50 72
Walaupun K telah berNilai sama dengan satu, tetapi Nilai C masih berNilai sama dengan 1 maka perbandingan harus diulang kembali dengan memberi Nilai C=0 dan Nilai K sama seperti sebelumnya yaitu sama dengan 1. Setelah dilakukan perbandingan maka hasilnya dapat diperoleh seperti berikut:
6 15 20 25 30 45 50 72
Karena Nilai C tidak lagi berubah menjadi 1 maka perbandingan telah berakhir dan hasil terakhir merupakan hasil pengurutan yang diharapkan.
/* Program Pengurutan Metode Shell Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_06a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, N, l, k; int temp, jarak, s; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(4)<<Nilai[i]; //Proses Pengurutan jarak = N / 2; cout<<"\nJarak = "<<jarak; while(jarak >=1) { do { s=0; for(i=0; i<=(N-jarak)-1; i++) { k=i+jarak; if(Nilai[i] > Nilai[k]) { temp = Nilai[i]; Nilai[i] = Nilai[k]; Nilai[k] = temp; s=1; for(l=0; l<N; l++) cout<<setw(4)<<Nilai[i]; cout<<"\n\t"; getch(); } } } while(s!=0); jarak /= 2; cout<<"\nJarak= "<<jarak; } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(4)<<Nilai[i]; getch(); }
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menurun dengan metode Shell Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut.
Dengan cara yang sama untuk pengurutan secara menaik, dengan mengganti tanda > menjadi < maka akan diperoleh elemen array yang terurut secara menurun. Gunakan program Lat_Sorting_06b.
/* Program Pengurutan Metode Shell Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_06a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, N, l, k; int temp, jarak, s; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(4)<<Nilai[i]; //Proses Pengurutan jarak = N / 2; cout<<"\nJarak = "<<jarak; while(jarak >=1) { do { s=0; for(i=0; i<=(N-jarak)-1; i++) { k=i+jarak; if(Nilai[i] > Nilai[k]) { temp = Nilai[i]; Nilai[i] = Nilai[k]; Nilai[k] = temp; s=1; for(l=0; l<N; l++) cout<<setw(4)<<Nilai[i]; cout<<"\n\t"; getch(); } } } while(s!=0); jarak /= 2; cout<<"\nJarak= "<<jarak; } cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(4)<<Nilai[i]; getch(); }
6. Metode Merge Sort
Metode ini memanfaatkan keteraturan yang diperoleh dari hasil merging dua buah array. Suatu array Nilai yang mempunyai N elemen (Nilai[0..N-1]) dianggap terdiri dari N array yang masing-masing terdiri dari satu elemen. Untuk pasangan array yang berdekatan kita lakukan merging sehingga diperoleh N/2 buah array yang masing-masing array memiliki 2 elemen (jika N ganjil, akan terdapat sebuah array dengan 1 elemen). Pada saat melakukan proses merging dilakukan pengaturan posisi dengan cara elemen yang lebih kecil diletakkan di posisi awal (untuk pengurutan secara menaik) dan elemen yang lebih besar diletakkan di posisi awal(untuk pengurutan secara menurun). Kemudian dilakukan merging kembali untuk setiap pasanga array seperti cara di atas sehingga kita peroleh N/2 buah array yang masing-masing array memiliki 4 elemen. Langkah ini kita teruskan hingga kita memperoleh sebuah array yang sudah dalam keadaan terurut.
Misalkan kita memiliki array Nilai[0..13] = {45, 12, 4, 78, 90, 74, 40, 20, 10, 15, 25, 22, 95, 81} maka dengan menggunakan metode Merge Sort secara menaik dapat dilakukan seperti pada gambar.
7. Metode Insertion Sort
Metode Insertion Sort merupakan metode pengurutan dengan cara menyisipkan elemen array pada posisi yang tepat. Pencarian yang tepat dilakukan dengan melakukan pencarian beruntun di dalam array. Selama pencarian posisi yang tepat dilakukan pergeseran elemen array. Algoritma pengurutan ini tepat untuk persoalan menyisipkan elemen baru ke dalam array yang sudah terurut. Misalnya dalam permainan kartu, kartu yang dicabut biasanya disisipkan oleh pemain pada posisi yang tepat sehingga penambahan kartu tersebut membuat semua kartu tetap terurut.
Misalkan kita memiliki suatu array dengan N maka pengurutan secara menaik dengan metode Insertion Sort sebagai berikut:
Langkah -1: elemen pertama Nilai[0] diasumsikan telah sesuai tempatnya.
Langkah -2: ambil elemen ke dua (Nilai[1]), cari lokasi yang tepat pada Nilai[0..0] untuk Nilai Nilai[1]. Lakukan pergeseran ke kanan jika Nilai[0..1] lebih besar (untuk urut menaik) atau lebih kecil (untuk urut menurun) dari Nilai[1]. Misalnya posisi yang tepat adalah j, maka sisipkanlah Nilai[1] pada Nilai[j].
Langkah -3: ambil elemen ke tiga (Nilai[2]), cari lokasi yang tepat pada Nilai[0..1] untuk Nilai[2]. Lakukan pergeseran ke kanan jika Nilai[0..2] lebih besar (untuk urut menaik) atau lebih kecil (untuk urut menurun) dari Nilai[2]. Misalnya posisi yang tepat adalah j, maka sisipkanlah Nilai[2] pada Nilai[j].
Langkah -4: ambil elemen ke empat (Nilai[3]), cari lokasi yang tepat pada Nilai[0..3] untuk Nilai Nilai[3]. Lakukan pergeseran ke kanan jika Nilai[0..2] lebih besar (untuk urut menaik) atau lebih kecil (untuk urut menurun) dari Nilai[3]. Misalnya posisi yang tepat adalah j, maka sisipkanlah Nilai[3] pada Nilai[j].
…
Langkah –N: ambil elemen ke N (Nilai[N]), cari lokasi yang tepat pada Nilai[0..N-1] untuk Nilai Nilai[N]. Lakukan pergeseran ke kanan jika Nilai[0..N-1] lebih besar (untuk urut menaik) atau lebih kecil (untuk urut menurun) dari Nilai[N]. Misalnya posisi yang tepat adalah j, maka sisipkanlah Nilai[N] pada Nilai[j].
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menaik dengan metode Insertion Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut:
Langkah -1: Nilai[0] diasumsikan telah terurut.
Langkah -2: cari lokasi yang tepat untuk Nilai[1] pada Nilai[0..0]. Dalam hal ini, ternyata 72 tidak lebih besasr dari 25 maka tidak terjadi pergeseran, sehingga diperoleh array seperti berikut:
Langkah -3: cari lokasi yang tepat untuk Nilai[2] pada Nilai[0..1]. Dalam hal ini, ternyata lokasi yang tepat adalah 1, maka Nilai[1] digeser ke kanan sehingga Nilai[2] di posisi ke 1, sehingga diperoleh array sebagai berikut:
Langkah -4: cari lokasi yang tepat untuk Nilai[3] pada Nilai[0..2]. Dalam hal ini, ternyata lokasi yang tepat adalah 2, maka Nilai[2] digeser ke kanan sehingga Nilai[3] di posisi ke 3, sehingga diperoleh array seperti berikut:
Langkah -5: cari lokasi yang tepat untuk Nilai[4] pada Nilai[0..3]. Dalam hal ini, ternyata lokasi yang tepat adalah 0, maka Nilai[0], Nilai[1], Nilai[2], Nilai[3] digeser masing-masing satu posisi ke kanan sehingga Nilai[4] di posisi ke 0, sehingga array seperti berikut:
Langkah -6: cari lokasi yang tepat untuk Nilai[5] pada Nilai[0..4]. Dalam hal ini, ternyata lokasi yang tepat adalah 0, maka Nilai[0], Nilai[1], Nilai[2], Nilai[3] dan Nilai[4] digeser masing-masing satu posisi ke kanan sehingga Nilai[6] di posisi ke 0, diperoleh array seperti berikut:
Langkah -7: cari lokasi yang tepat untuk Nilai[6] pada Nilai[0..5]. Dalam hal ini, ternyata lokasi yang tepat adalah 0, maka Nilai[0], Nilai[1], Nilai[2], Nilai[3], Nilai[4] dan Nilai[5] digeser masing-masing satu posisi ke kanan sehingga Nilai[6] di posisi ke 0, diperoleh array seperti berikut:
Langkah -8: cari lokasi yang tepat untuk Nilai[7] pada Nilai[0..6]. Dalam hal ini, ternyata lokasi yang tepat adalah 6, maka Nilai[6] digeser satu posisi ke kanan sehingga Nilai[7] di posisi ke 6, diperoleh array seperti berikut:
Selesai. Dan array telah terurut secara menaik. Program untuk mengurutkan elemen array secara menaik dengan metode Insertion Sort dapat dilihat pada program Lat_Sorting_07a.
/* Program Pengurutan Metode Insertion Sort Pengurutan Secara Menaik Nama File : Lat_Sorting_07a */ #include<iostream.h> #include<conio.h> #include<iomanip.h> void main() { int Nilai[20]; int i, j, k, N; int temp; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan for(i=1; i<N; i++) { temp = Nilai[i]; j=i-1; while((temp <= Nilai(j)) && (j>=1)) { Nilai[j+1] = Nilai[j]; j--; } if(temp >= Nilai[j]) Nilai[j+1] = temp; else { Nilai[j+1] = Nilai[j]; Nilai[j] = temp; } cout<<endl; for(k=0; k<N; k++) cout<<setw(3)<<Nilai[k]; } //Proses Cetak Setelah diurutkan cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
Contoh: Misalkan kita mempunyai array Nilai sebanyak 8 elemen akan diurutkan secara menurun dengan metode Insertion Sort: 25, 72, 30, 45, 20, 15, 6, 50. Urutan langkah pengurutannya seperti berikut:
Langkah -1: Nilai[0] diasumsikan telah terurut
Langkah -2: cari lokasi yang tepat untuk Nilai[2] pada Nilai[0..0]. Dalam hal ini, ternyata lokasi yang tepat adalah 0, maka Nilai[0] digeser ke kanan satu posisi dan Nilai[1] menempati posisi ke 0, sehingga diperoleh array seperti berikut:
Langkah -3: cari lokasi yang tepat untuk Nilai[2] pada Nilai[0..1]. Dalam hal ini, ternyata lokasi yang tepat adalah 1, maka Nilai[1] digeser satu posisi ke kanan sehingga Nilai[2] di posisi ke 1, sehingga diperoleh array seperti berikut:
Langkah -4: cari lokasi yang tepat untuk Nilai[3] pada Nilai[0..2]. Dalam hal ini, ternyata lokasi yang tepat adalah 1, maka Nilai[1] dan Nilai[2] digeser satu posisi ke kanan sehingga Nilai[3] di posisi ke 1, sehingga diperoleh array seperti berikut:
Langkah -5: cari lokasi yang tepat untuk Nilai[4] pada Nilai[0..3]. Dalam hal ini, ternyata lokasi yang tepat adalah 4, tapi karena oleh dirinya sendiri maka tidak ada pergeseran, sehingga array seperti berikut:
Langkah -6: cari lokasi yang tepat untuk Nilai[5] pada Nilai[0..4]. Dalam hal ini, ternyata lokasi yang tepat adalah 5, tapi karena oleh dirinya sendiri maka tidak ada pergeseran, sehingga array seperti berikut:
Langkah -7: cari lokasi yang tepat untuk Nilai[6] pada Nilai[0..5]. Dalam hal ini, ternyata lokasi yang tepat adalah 6, tapi karena oleh dirinya sendiri maka tidak ada pergeseran, sehingga array seperti berikut:
Langkah -8: cari lokasi yang tepat untuk Nilai[7] pada Nilai[0..6]. Dalam hal ini, ternyata lokasi yang tepat adalah 1, maka Nilai[1], Nilai[2], Nilai[3], Nilai[4], Nilai[5], Nilai[6] digeser satu posisi ke kanan sehingga Nilai[7] di posisi ke 1, diperoleh array seperti berikut:
Selesai. Dan array telah terurut secara menaik. Program untuk mengurutkan elemen array secara menaik dengan metode Insertion Sort dapat dilihat pada program Lat_Sorting_07a.
//* Program Pengurutan Metode Insertion SortPengurutan Secara Menurun Nama File : Lat_Sorting_07b */ #include<iostream.h> #include<conio.h> #inlcude<iomanip.h> void main() { int Nilai[20]; int i, j, k, N; int temp; //bool ketemu; cout<<"Masukkan Banyak Bilangan : "; cin>>N; for(i=0; i<N; i++) { cout<<"Elemen ke-"<<i<<" : "; cin>>Nilai[i]; } //Proses Cetak Sebelum diurutkan cout<<"\nData sebelum diurut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; //Proses Pengurutan for(i=1; i<N; i++) { temp = Nilai[i]; j=i-1; while((temp > Nilai[i]) && (j>=1)) { Nilai[j+1] = Nilai[j]; j--; } if(temp <= Nilai[j]) Nilai[j+1] = temp; else { Nilai[j+1] = Nilai[j]; Nilai[j] = temp; } cout<<endl; for(k=0; k<N; k++) cout<<setw(3)<<Nilai[k]; } //Proses Cetak Setelah diurutkan cout<<"\nData Setelah di urut : "; for(i=0; i<N; i++) cout<<setw(3)<<Nilai[i]; getch(); }
Nama : A .MUH Alryan Pangeran Syamsibah
Nim : 200210502027
Kelas : Teknik Komputer B