Pengurutan (Sorting)
-
Upload
denny-gunawan -
Category
Documents
-
view
218 -
download
2
Transcript of Pengurutan (Sorting)
STRUKTUR DATA: ALGORITMA PENGURUTAN
1 Widodo
ALGORITMA PENGURUTAN (SORTING) Teknik/algoritma untuk mengurutkan data sampai saat ini sudah banyak dikembangkan. Pada pembahasan materi sorting berikut ini akan dibahas 3 (tiga) algoritma untuk melakukan sorting: 1. Bubble Sort (Pengurutan gelembung) 2. Insertion Sort (Pengurutan sisip) 3. Selection sort (Pengurutan seleksi) 1. BUBBLE SORT
Metode bubble sort dilakukan dengan cara elemen paling kecil di‐“apung”‐kan pada posisi paling kiri (jika ascending). Bubble sort akan dilakukan dengan pass sebanyak jumlah data kurang satu (n‐1) kali. Jika data berjumlah 10, maka akan terjadi 9 kali pass. Pada setiap pass, data akan dibandingkan dari yang paling kanan dengan data sebelumnya, jika data ke‐n lebih kecil dari data n‐1, maka ditukar, jika tidak tetap. Hal tersebut dilakukan sampai dengan data pertama, sehingga pada akhir pass, data pertama akan dijamin sebagai data paling kecil. Pada pass berikutnya dilakukan hal yang sama sampai dengan data kedua (data pertama sudah yang terkecil). Demikian seterusnya dilakukan hingga pass yang terakhir. Berikut ilustrasi bagaimana bubble sort dijalankan. Misal data yang dimasukkan adalah: 10 15 3 7 6 14 22 1 100 4 Data di atas berjumlah n=10, berarti akan ada 9 pass (i=9) Misalkan data disimpan pada array s[], maka: Pass 1:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (4<100) Tukar 10 – 15 – 3 – 7 – 6 – 14 – 22 – 1 – 4 – 100
9 s[9]<s[8]? (4<1) Tidak 10 – 15 – 3 – 7 – 6 – 14 – 22 – 1 – 4 – 100
8 s[8]<s[7]? (1<22) Tukar 10 – 15 – 3 – 7 – 6 – 14 – 1 – 22 – 4 – 100
7 s[7]<s[6]? (1<14) Tukar 10 – 15 – 3 – 7 – 6 – 1 – 14 – 22 – 4 – 100
6 s[6]<s[5]? (1<6) Tukar 10 – 15 – 3 – 7 – 1 – 6 – 14 – 22 – 4 – 100
5 s[5]<s[4]? (1<7) Tukar 10 – 15 – 3 – 1 – 7 – 6 – 14 – 22 – 4 – 100
4 s[4]<s[3]? (1<3) Tukar 10 – 15 – 1 – 3 – 7 – 6 – 14 – 22 – 4 – 100
3 s[3]<s[2]? (1<15) Tukar 10 – 1 – 15 – 3 – 7 – 6 – 14 – 22 – 4 – 100
2 s[2]<s[1]? (1<10) Tukar 1 – 10 – 15 – 3 – 7 – 6 – 14 – 22 – 4 – 100
STRUKTUR DATA: ALGORITMA PENGURUTAN
2 Widodo
Hasil akhir pass 1: 1 – 10 – 15 – 3 – 7 – 6 – 14 – 22 – 4 – 100 Pass 2:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<4) Tidak 1 – 10 – 15 – 3 – 7 – 6 – 14 – 22 – 4 – 100
9 s[9]<s[8]? (4<22) Tukar 1 – 10 – 15 – 3 – 7 – 6 – 14 – 4 – 22 – 100
8 s[8]<s[7]? (4<14) Tukar 1 – 10 – 15 – 3 – 7 – 6 – 4 – 14 – 22 – 100
7 s[7]<s[6]? (4<6) Tukar 1 – 10 – 15 – 3 – 7 – 4 – 6 – 14 – 22 – 100
6 s[6]<s[5]? (4<7) Tukar 1 – 10 – 15 – 3 – 4 – 7 – 6 – 14 – 22 – 100
5 s[5]<s[4]? (4<3) Tidak 1 – 10 – 15 – 3 – 4 – 7 – 6 – 14 – 22 – 100
4 s[4]<s[3]? (3<15) Tukar 1 – 10 – 3 – 15 – 4 – 7 – 6 – 14 – 22 – 100
3 s[3]<s[2]? (3<10) Tukar 1 – 3 – 10 – 15 – 4 – 7 – 6 – 14 – 22 – 100
Hasil akhir pass 2: 1 – 3 – 10 – 15 – 4 – 7 – 6 – 14 – 22 – 100 Pass 3:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 10 – 15 – 4 – 7 – 6 – 14 – 22 – 100
9 s[9]<s[8]? (22<14) Tidak 1 – 3 – 10 – 15 – 4 – 7 – 6 – 14 – 22 – 100
8 s[8]<s[7]? (14<6) Tidak 1 – 3 – 10 – 15 – 4 – 7 – 6 – 14 – 22 – 100
7 s[7]<s[6]? (6<7) Tukar 1 – 3 – 10 – 15 – 4 – 6 – 7 – 14 – 22 – 100
6 s[6]<s[5]? (6<4) Tidak 1 – 3 – 10 – 15 – 4 – 6 – 7 – 14 – 22 – 100
5 s[5]<s[4]? (4<15) Tukar 1 – 3 – 10 – 4 – 15 – 6 – 7 – 14 – 22 – 100
4 s[4]<s[3]? (4<10) Tukar 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100
Hasil akhir pass 3: 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100 Pass 4:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100
9 s[9]<s[8]? (22<14) Tidak 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100
8 s[8]<s[7]? (14<7) Tidak 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100
7 s[7]<s[6]? (7<6) Tidak 1 – 3 – 4 – 10 – 15 – 6 – 7 – 14 – 22 – 100
6 s[6]<s[5]? (6<15) Tukar 1 – 3 – 4 – 10 – 6 – 15 – 7 – 14 – 22 – 100
5 s[5]<s[4]? (6<10) Tukar 1 – 3 – 4 – 6 – 10 – 15 – 7 – 14 – 22 – 100
STRUKTUR DATA: ALGORITMA PENGURUTAN
3 Widodo
Hasil akhir pass 4: 1 – 3 – 4 – 6 – 10 – 15 – 7 – 14 – 22 – 100 Pass 5:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 6 – 10 – 15 – 7 – 14 – 22 – 100
9 s[9]<s[8]? (22<14) Tidak 1 – 3 – 4 – 6 – 10 – 15 – 7 – 14 – 22 – 100
8 s[8]<s[7]? (14<7) Tidak 1 – 3 – 4 – 6 – 10 – 15 – 7 – 14 – 22 – 100
7 s[7]<s[6]? (7<15) Tukar 1 – 3 – 4 – 6 – 10 – 7 – 15 – 14 – 22 – 100
6 s[6]<s[5]? (7<10) Tukar 1 – 3 – 4 – 6 – 7 – 10 – 15 – 14 – 22 – 100
Hasil akhir pass 5: 1 – 3 – 4 – 6 – 7 – 10 – 15 – 14 – 22 – 100 Pass 6:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 15 – 14 – 22 – 100
9 s[9]<s[8]? (22<14) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 15 – 14 – 22 – 100
8 s[8]<s[7]? (14<15) Tukar 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
7 s[7]<s[6]? (14<10) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
Hasil akhir pass 6: 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Pass 7:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
9 s[9]<s[8]? (22<15) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
8 s[8]<s[7]? (15<14) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
Hasil akhir pass 7: 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
STRUKTUR DATA: ALGORITMA PENGURUTAN
4 Widodo
Pass 8:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
9 s[9]<s[8]? (22<15) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
Hasil akhir pass 8: 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Pass 9:
j Perbandingan elemen Tukar/tidak Hasil sementara 10 s[10]<s[9]? (100<22) Tidak 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100
Hasil akhir pass 9: 1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Hasil akhir pass 9 ini juga menjadi hasil akhir data yang sudah terurut. Algoritma bubble sort dalam bentuk pseudocode‐nya adalah: for i 1 to (n-1) do for j n downto 1 do if s[j]<s[j-1] then temp s[j] s[j] s[j-1] s[j-1] temp endif endfor endfor
STRUKTUR DATA: ALGORITMA PENGURUTAN
5 Widodo
Contoh source code‐nya dalam bahasa C: #include<stdio.h> #include<conio.h> int s[100],i,j,n,temp; main() { printf("Jumlah data = "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("data ke-%d=",i); scanf("%d",&s[i]); } printf("\n\n"); printf("Data sebelum diurutkan: "); for(i=1;i<=n;i++) { printf("%d ",s[i]); } for(i=1;i<=n-1;i++) { for(j=n;j>=i+1;j--) { if(s[j]<s[j-1]) { temp=s[j]; s[j]=s[j-1]; s[j-1]=temp; } } } printf("\n\n\n"); printf("Data setelah diurutkan: "); for(i=1;i<=n;i++) { printf("%d ",s[i]); } getch(); }
2. INSERTION SORT Algoritma pengurutan insertion sort dilakukan dengan cara melakukan scanning sesuai urutan array, yang kemudian akan menyisipkan (menempatkan) data pada posisi yang sesuai. Scanning dimulai dari data paling kiri ke kanan. Seperti pada bubble sort, pada insertion sort juga dibagi menjadi tahap‐tahap (pass).
STRUKTUR DATA: ALGORITMA PENGURUTAN
6 Widodo
Pass 1 dianggap tidak dihitung karena hanya scan data pertama, dan sudah pasti terurut. Secara resmi algoritma ini akan memulai dari pass 2, yaitu scanning terhadap urutan 1 s.d 2, data ke‐2 akan ditempatkan pada posisi yang tepat. Pada pass 3 scanning dilakukan terhadap data 1 s.d 3, dengan menempatkan data k3‐3 pada posisi sesuai dengan tempatnya. Berikut ilustrasi insertion sort dengan data yang sama seperti pada bubble sort. Misal data yang dimasukkan adalah: 10 15 3 7 6 14 22 1 100 4 Data di atas berjumlah n=10, berarti akan ada 9 pass dimulai dari 2 s.d 9. Misalkan data disimpan pada array s[], maka: Pada saat pass 1 data pertama, yaitu 10 dianggap sudah terurut. Maka langsung ke pass 2.
– 15 – 3 – 7 – 6 – 14 – 22 – 1 – 100 – 4 10 Pass 2: Cari posisi untuk s[2]=15 dalam urutan 10 – 15
– 3 – 7 – 6 – 14 – 22 – 1 – 100 – 4 10 – 15 Pass 3: Cari posisi untuk s[3]=3 dalam urutan 10 – 15 – 3
– 7 – 6 – 14 – 22 – 1 – 100 – 4 3 – 10 – 15 Pass 4: Cari posisi untuk s[4]=7 dalam urutan 3 – 10 – 15 – 7
– 6 – 14 – 22 – 1 – 100 – 4 3 – 7 – 10 – 15 Pass 5: Cari posisi untuk s[5]=6 dalam urutan 3 – 7 – 10 – 15 – 6
– 14 – 22 – 1 – 100 – 4 3 – 6 – 7 – 10 – 15 Pass 6: Cari posisi untuk s[6]=14 dalam urutan 3 – 6 – 7 – 10 – 15 – 14
– 22 – 1 – 100 – 4 3 – 6 – 7 – 10 – 14 – 15
STRUKTUR DATA: ALGORITMA PENGURUTAN
7 Widodo
Pass 7: Cari posisi untuk s[7]=22 dalam urutan 3 – 6 – 7 – 10 – 14 – 15 – 22
– 1 – 100 – 4 3 – 6 – 7 – 10 – 14 – 15 – 22 Pass 8: Cari posisi untuk s[8]=1 dalam urutan 3 – 6 – 7 – 10 – 14 – 15 – 22 – 1
– 100 – 4 1 – 3 – 6 – 7 – 10 – 14 – 15 – 22 Pass 9: Cari posisi untuk s[9]=100 dalam urutan 1 – 3 – 6 – 7 – 10 – 14 – 15 – 22 – 100
– 4 1 – 3 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Pass 10: Cari posisi untuk s[10]=4 dalam urutan 1 – 3 – 6 – 7 – 10 – 14 – 15 – 22 – 100 – 4
1 – 3 – 4 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Hasil akhir pass 10 ini juga menjadi hasil akhir dari insertion sort secara keseluruhan. Algoritma insertion sort dalam bentuk pseudocode‐nya adalah: for i 2 to n do x i while(s[x]<s[x-1]) temp=s[x]; s[x]=s[x-1]; s[x-1]=temp; x=x-1;
STRUKTUR DATA: ALGORITMA PENGURUTAN
8 Widodo
Contoh source code‐nya dalam bahasa C: #include<stdio.h> #include<conio.h> int s[100],i,j,n,temp,x; main() { printf("Jumlah data = "); scanf("%d",&n); printf("\n"); for(i=1;i<=n;i++) { printf("data ke-%d=",i); scanf("%d",&s[i]); } printf("\n\n"); printf("Data sebelum diurutkan\n"); for(i=1;i<=n;i++) { printf("%d ",s[i]); } for(i=2;i<=n;i++) { x=i; while(s[x]<s[x-1]) { temp=s[x]; s[x]=s[x-1]; s[x-1]=temp; x=x-1; } } printf("\n\n\nData setelah diurutkan"); printf("\n"); for(i=1;i<=n;i++) { printf("%d ",s[i]); } getch(); }
3. SELECTION SORT Algoritma selection sort dilakukan dengan menempatkan nilai maksimum atau minimum pada bagian paling kanan atau kiri. Prosesnya adalah dengan melakukan scanning dari data ke 1 s.d ke n, tempatkan yang paling besar atau kecil sesuai urutan (ascending atau descending). Pada pass berikutnya scanning dilakukan dari data ke‐1 s.d data ke (n‐1), tempatkan nilai
STRUKTUR DATA: ALGORITMA PENGURUTAN
9 Widodo
maksimum/minimum pada posisi (n‐1), demikian seterusnya. Pada bagian ini akan diilustrasikan untuk urut ascending, berarti menempatkan nilai maksimum pada bagian kanan. Jumlah pass = n‐1, pada setiap pass cari nilai maksimum kemudian tukar nilai maksimum tersebut dengan elemen ke‐n, lalu n dikurang 1. Misal data yang dimasukkan adalah: 10 15 3 7 6 14 22 1 100 4 Data di atas berjumlah n=10, berarti akan ada 9 pass dimulai dari 1 s.d 9. Misalkan data disimpan pada array s[], maka: Pass 1: Cari nilai maksimum pada array 1 s.d 10, nilai maks s[9]=100, maka 10 – 15 – 3 – 7 – 6 – 14 – 22 – 1 – 100 – 4, menjadi: 10 – 15 – 3 – 7 – 6 – 14 – 22 – 1 – 4 – 100 Pass 2: Cari nilai maksimum pada array 1 s.d 9, nilai maks s[7]=22, maka 10 – 15 – 3 – 7 – 6 – 14 – 22 – 1 – 4 – 100, menjadi: 10 – 15 – 3 – 7 – 6 – 14 – 4 – 1 – 22 – 100 Pass 3: Cari nilai maksimum pada array 1 s.d 8, nilai maks s[2]=15, maka 10 – 15 – 3 – 7 – 6 – 14 – 4 – 1 – , menjadi: 22 – 10010 – 1 – 3 – 7 – 6 – 14 – 4 – 15 – 22 – 100 Pass 4: Cari nilai maksimum pada array 1 s.d 7, nilai maks s[6]=14, maka 10 – 1 – 3 – 7 – 6 – 14 – 4 – , menjadi: 15 – 22 – 10010 – 1 – 3 – 7 – 6 – 4 – 14 – 15 – 22 – 100 Pass 5: Cari nilai maksimum pada array 1 s.d 6, nilai maks s[1]=10, maka 10 – 1 – 3 – 7 – 6 – 4 – , menjadi: 14 – 15 – 22 – 1004 – 1 – 3 – 7 – 6 – 10 – 14 – 15 – 22 – 100
STRUKTUR DATA: ALGORITMA PENGURUTAN
10 Widodo
Pass 6: Cari nilai maksimum pada array 1 s.d 5, nilai maks s[4]=7, maka 4 – 1 – 3 – 7 – 6 – , menjadi: 10 – 14 – 15 – 22 – 1004 – 1 – 3 – 6 – 7 – 10 – 14 – 15 – 22 – 100 Pass 7: Cari nilai maksimum pada array 1 s.d 4, nilai maks s[1]=4, maka 4 – 1 – 3 – 6 – , menjadi: 7 – 10 – 14 – 15 – 22 – 1006 – 1 – 3 – 4 – 7 – 10 – 14 – 15 – 22 – 100 Pass 8: Cari nilai maksimum pada array 1 s.d 3, nilai maks s[1]=6, maka 6 – 1 – 3 – , menjadi: 4 – 7 – 10 – 14 – 15 – 22 – 1003 – 1 – 6 – 4 – 7 – 10 – 14 – 15 – 22 – 100 Pass 9: Cari nilai maksimum pada array 1 s.d 2, nilai maks s[1]=3, maka 3 – 1 – , menjadi: 6 – 4 – 7 – 10 – 14 – 15 – 22 – 1001 – 3 – 6 – 4 – 7 – 10 – 14 – 15 – 22 – 100 Hasil pass 9 menjadi hasil akhir yang sudah terurut. Algoritma selection sort dalam bentuk pseudocode‐nya adalah: imaks 0 for i n downto 2 do for j i downto 1 do if s[j]>s[imaks] imaksj temp s[i] s[i] s[imaks] s[imaks] temp imaks 0
STRUKTUR DATA: ALGORITMA PENGURUTAN
11 Widodo
Contoh source‐code‐nya dalam bahasa C: #include<stdio.h> #include<conio.h> int s[100],i,j,n,imaks,temp; main() { printf("Jumlah data = "); scanf("%d",&n); printf("\n"); for(i=1;i<=n;i++) { printf("data ke-%d=",i); scanf("%d",&s[i]); } printf("\n\n"); printf("Data sebelum diurutkan\n"); for(i=1;i<=n;i++) { printf("%d ",s[i]); } imaks=0; for(i=n;i>=2;i--) { for(j=i;j>=1;j--) { if(s[j]>s[imaks]) { imaks=j; } } temp=s[i]; s[i]=s[imaks]; s[imaks]=temp; imaks=0; } printf("\n\n"); printf("Data setelah diurutkan\n"); for(i=1;i<=n;i++) { printf("%d ",s[i]); } getch(); }