Algoritma pengurutan sisipan untuk pengurutan menaik
PENGURUTAN
III. METODE PENGURUTAN SISIPAN (INSERTION SORT)
Metode ini melakukan pengurutan dengan cara menyisipkan elemen array pada posisi yang tepat. Pencarian posisi yang tepat dilakukan dengan menyisir larik. Selama penyisiran, dilakukan pergeseran elemen array.
Algoritma pengurutan sisipan untuk pengurutan menaik Untuk mendapatkan array yang terurut menaik , algoritma pengurutan sisipan secara garis besar ditulis sbb:
Jumlah elemen : N Untuk setiap tahap i = 1, 3, …, n ; lakukan: Indeks tetendah : 0
1) x L[i] Indeks tertinggi : n = N - 1 2) sisipkan x pada tempat yang sesuai antara L[0]…L[i]
Jumlah penyisipan = N - 1 L = 15 10 7 22 17 5 22 i = 0 1 .. .. .. .. n Rincian setiap tahap adalah sebagai berikut:
TAHAP I: Mulai dari L[1] : Simpan nilai L[1] ke variabel x Geser masing-masing satu langkah ke kanan semua nilai yang ada disebelah kiri L[1] satu persatu apabila nilai tersebut lebih besar dari x Setelah itu sisipkan x dibekas tempat nilai yang terakhir digeser
TAHAP II: Dilanjutkan ke L[2] : Simpan nilai L[2] ke variabel x Geser masing-masing satu langkah ke kanan semua nilai yang ada disebelah kiri L[2] satu persatu apabila nilai tersebut lebih besar dari x Setelah itu sisipkan x dibekas tempat nilai yang terakhir digeser..
Demikian seterusnya untuk elemen berikutnya, dan terakhir L[6]. Sehingga untuk jumlah elemen = 7 maka ada 6
tahap proses.Algoritma penyisipan menaik dapat ditulis:
procedure Insertion(input/output L : LarikInt, input n : integer) while((j 0) and (not ketemu)) do DEKLARASI if x L[j] then i : integer {Pencacah tahap}
L[j + 1] L[j] {geser} j : integer {Pencacah untuk penelusuran larik} j j - 1 x : integer {Peubah bantu} else ketemu : boolean {Untuk menyatakan posisi penyisipan ditemukan} ketemu true
DESKRIPSI endif for i 1 to n do endwhile x L[i] L[j + 1] x j i - 1 endfor ketemu = false
Metode ini memerlukan banyak operasi pergeseran untuk tiap tahapnya sehingga kurang bagus untuk jumlah data yang banyak.
Program C++ untuk pengurutan sisipan menaik:
/*Mengurutkan data dengan metode Penyisipan*/ #include<iostream.h> #define N 10 /*Jumlah data*/ void InsertionSort(int data[],int n); /*prototipe fungsi*/ void main(void) { int i; int n=N-1; int data[]={20,10,32,100,60,12,70,25,45,65}; cout<<"Sebelum diurutkan :"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; cout<<"_______________________________"<<endl; InsertionSort(data,n); cout<<"Setelah diurutkan"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl;
} void InsertionSort(int array1[],int n) { int i,j,x; bool ketemu; for(i=1;i<=n;i++) { x=array1[i]; j=i-1; ketemu=false; while((j>=0) && (!ketemu)) { if(x<array1[j])
{ array1[j+1]=array1[j]; j=j-1;
} else ketemu=true;
} array1[j+1]=x; }
}
Contoh : Urutkan secara menaik elemen dari array sbb: A : 15 10 7 22 17 5 12 Index : 0 1 2
3 4 5 6
Mulai dari index 1 TAHAP I : 15
10
7
22
17
5
12 X = A[1] = 10
A[0] X, geser A[0] kekanan, proses selesai karena sudah sampai index 015
15
7
22
17
5
12 Sisipkan X menggantikan A[0] (index terakhir yg digeser)
15
7
10
15
22
17
5
12 Sisipkan X menggantikan A[0] (index terakhir yg digeser)
10
12 A[0] X, A[0] geser kekanan, proses selesai karena sudah sampai index 0
15
22
17
5
12 Mulai dari index 3 TAHAP III : 7 10 15 22 17 5 12 X = A[3] = 22 A[2] ! X, proses selesai, sisipkan X ke A[3]
7 10 15 22 17 5 12
10
5
7
22
22
17
5
12 Mulai dari index 2 TAHAP II : 10
15
7
17
17
10
12 X = A[2] = 7 A[1] X, geser A[1] kekanan
10
15
15
22
5
Mulai dari index 4 TAHAP IV :
7
10
15
22
17
5
12 X = A[4] = 17 A[3] X, geser A[3] kekanan
7
10
15
22
22
5
12 A[2] ! X, proses selesai , sisipka X ke A[3](terakhir digeser)
10
7
17
22
12
A[1] X, geser A[1] kekanan7
10
10
15
17
22
12
A[0] X, geser A[0] kekanan, proses selesai karena sudah sampai index 07
10
15
15
17
22
12
sisipka X ke A[0](terakhir digeser)5
7
10
15
17
22
12
15
10
15
7
17
22
5
12 Mulai dari index 5 TAHAP V :
7
10
15
17
22
5
12 X = A[5] = 5 A[4] X, geser A[4] kekanan
10
7
15
17
22
22
12
A[3] X, geser A[3] kekanan7
10
15
17
17
22
12
A[2] X, geser A[2] kekanan7
Mulai dari index 6 TAHAP VI : 5
7
10
15
17
22
12 X = A[6] = 12 A[5] X, geser A[5] kekanan
5
7
10
15
17
22
22 A[4] X, geser A[4] kekanan
5
7
10
15
17
17
22 A[3] X, geser A[3] kekanan
5
7
10
15
15
17
22 A[2] ! X, proses selesai , sisipka X ke A[3](terakhir digeser)
5
7
10
12
15
17
22 IV. METODE PENGURUTAN SHELL
Diberi nama sesuai dengan penemunya yaitu Donald Shell tahun 1959. Metode ini merupakan perbaikan
terhadap metode pengurutan sisipan. Insertion sort mempunyai keunggulan bila data yang diurutkan sudah hampir urut. Tetapi untuk data yang urutannya terbalik atau banyak data yang berada didaerah berlawanan maka akan banyak sekali proses penggeseran. Untuk mengurangi pergeseran terlalu jauh maka larik diurutkan setiap k elemen dengan menggunakan metodepengurutan sisip( k dinamakan step atau increment), misal k=5. Selanjutnya digunakan nilai step yang lebih kecil,
misal k=3, lalu diurut setiap 3 elemen. Begitu seterusnya sampai nilai k=1. Untuk menjelaskan metode ini, tinjaulah sebuah data sbb: A : 27 25 12 32 60 52 35 37 47 17 45 10 5 15 indek :1
2
3
4
5
6
7
8
9 10 11 12 13 Pass 1 (step = 5)
27 25 12 32 60 52 35 37 47 17 45 10
1
7
6
5
4
3
2
1
8 9 10 11 12 13
7
6
5
4
3
2
47
9
32
15
15
47
32
10 11 12 13
9
8
7
6
5
4
3
2
8
10 11 12 13
8 9 10 11 12 13
6
10 11 12 13
9
8
7
6
5
4
3
2
1
10 11 12 13 27 10 5 15 17 45 25 12 32 60 52 35 37 47
9
8
7
5
60
4
17
17
60
1
2
3
5
4
6
7
8 9 10 11 12 13
1
2
3
1
7
5
3
9
8
7
6
5
4
3
2
1
8 9 10 11 12 13
7
6
5
4
2
25
6
15
1
2
3
4
5
7
1
8 9 10 11 12 13
27
52
45 27
45
52
10 11 12 13
35
6
6
5
4
3
2
1
37
12
5
37 5
12
10 11 12 13
9
8
7
5
10
4
10
25
35
1
2
3
5
4
6
7
8 9 10 11 12 13
1
2
3
Hasil Pass 1 adalah : 27, 10, 5, 15, 17, 45, 25, 12, 32, 60, 52, 35, 37, 47
Pass 2 (step = 3)
2
9
10
11
12
13
1
3
7
4
5
6
7
8
9
10
8
6
12
32 35
9
10
11
12
13
5
45
5
5
32
35
45
1
2
3
4
11
13 15 10 5 25 12 32 27 17 35 37 47 45 60 52
7
1
7
8
9
10
11
12 13 5 10 12 15 17 25 27 32 35 37 45 47 52 60 Diselesaikan dengan metode Insertion Sort biasa
2
5
3
4
5
6
7
8
9
6
4
1
9
2
3
4
5
6
7
8
10
3
11
12
13 Hasil pass 2 adalah : 15, 10, 5, 25, 12, 32, 27, 17, 35, 37, 47, 45, 60, 52
Terlihat bahwa hampir semua nilai kecil berada di bagian kiri, sehingga pada pass terakhir dapat dilakukan pengurutan metode sisipan untuk seluruh data dengan lebih efisien Pass 1 (step = 1)
15 10 5 25 12 32 27 17 35 37 47 45 60 52 Hasilnya :
1
2
8
6
27 10 5 15 17 45 25 12 32 60 52 35 37 47
5
37
60
1
2
3
4
6
25
7
8
9
10
11
12
13
27
37 15
2
8
1
2
3
4
5
6
7
9
60
10
11
12
13
27
15
25
1
3
5
9
2
3
4
5
6
7
8
10
52
11
12
13
1
2
3
4
1
47
4
12
5
6
7
8
9
10
11
13
17
10
17
12
52
47
10
12
10 11 12 13 Notasi Algoritmik :
procedure Insertion(input/output L : LarikInt, input n, start, step : integer) DEKLARASI i : integer {Pencacah tahap} j : integer {Pencacah untuk penelusuran larik} x : integer {Peubah bantu} ketemu : boolean {Untuk menyatakan posisi penyisipan ditemukan}
DESKRIPSI i start + step while i n do x L[i] j i - step ketemu = false while((j 0) and (not ketemu)) do if x L[j] then
L[j + step] L[j] {geser} j j - step else ketemu true endif endwhile
L[j + step] x endwhile procedure Shell(input/output L : LarikInt, input n : integer) DEKLARASI step, start : integer DESKRIPSI step 5 while step = 1 do for start 0 to step do
Insertion(L, n, start, step) endfor step step - 2 endwhile Program C++ :
#include<iostream.h> #define N 10 /*Jumlah data*/ void InsertionSort(int data[],int n,int start,int step); void ShellSort(int data[],int n); void main(void) { int i, n=N-1; int data[]={20,10,32,100,60,12,70,25,45,65}; cout<<"Sebelum diurutkan :"<<endl; for(i=0;i<=n;i++)cout<<data[i]<<" "; cout<<endl; cout<<"_______________________________"<<endl; ShellSort(data,n); cout<<"Setelah diurutkan"<<endl; for(i=0;i<=n;i++)cout<<data[i]<<" "; cout<<endl;
} void ShellSort(int data[],int n) { int start,step; for(step=5;step>=1;step-=2) { for(start=0; start<=step;start++)
InsertionSort(data,n,start,step); }
} void InsertionSort(int data[],int n, int start, int step) { int i,j,x; bool ketemu; i=start+step; while(i<=n) { x=data[i]; j=i-step; ketemu=false; while((j>=0) && (!ketemu)) { if(x<data[j])
{ data[j+step]=data[j]; j=j-step;
} else ketemu=true;
} data[j+step]=x; i=i+step;
} }
TUGAS
1. Buatlah program C++ untuk mengurutkan data berikut secara menurun dengan menggunakan metode Sisipan: A : 27 25 12 32 60 52 35 37 47 17 45 10 5 15
2. Buatlah program C++ untuk mengurutkan data berikut secara menurun dengan menggunakan metode Shell: A : 27 25 12 32 60 52 35 37 47 17 45 10 5 15