Bubble Sort
Mengambil konsep bahwa yang tertinggi / terendah harus diletakkan di paling depan/ belakang, dengan cara swap angka. Begitu seterusnya sampai data terakhir
void Bubble(int
*DataArr, int n)
{
int i, j;
for(i=1; i<n; i++)
for(j=n-1; j>=i; j--)
if(DataArr[j-1] > DataArr[j])
Swap(&DataArr[j-1],&DataArr[j]);
}
Selection Sort
Mengambil konsep bahwa data yang sedang dibandingkan akan dibandingkan dengan sisa data. Counter array akan disimpan dalam satu variable temporary jika syarat terpenuhi, lalu isi dari array variable temporary itu akan ditukar dengan data yang dibandingkan.
void SelectionSort(int data[], int n)
{
int i, j, idx_low;
for (i = 0; i < n – 1;
i++) {
idx_low = i;
for (j = i + 1; j < n;
j++)
if (data[idx_low] > data[j])
idx_low = j;
if (idx_low > i) swap(&data[i],
&data[idx_low]);
}
}
Mengambil konsep menggeser array sampai syarat tertentu tidak terpenuhi lagi, kemudian memasukkan ke array yang sekarang
void
Insertion(int *Arr, int n){
int i, k, y;
for(k=1; k < n; k++) {
y = Arr[k];
for(i=k-1; i >= 0 && y < Arr[i];
i--)
Arr[i+1]
= Arr[i];
Arr[i+1] = y;
}
}
Quick Sort
void
QuickSort(int L,int R) {
int j,k;
if(L < R){
j = L;
k = R + 1;
do{
do{ j=j+1;} while(Arr[j] < Arr[L]);
do{ k=k-1;} while(Arr[k] > Arr[L]);
if(j < k) Swap(&Arr[j],&Arr[k]);
}while(j <= k);
Swap(&Arr[L],&Arr[k]);
QuickSort(L,k-1);
QuickSort(k+1,R);
}
}
Merge Sort
Mengambil konsep membagi array menjadi 2 bagian secara terus menerus sampai hanya tersisa satu, lalu array tersebut dibandingkan dengan array lawannya. Jika misalkan syarat a lebih kecil b terpenuhi, a dimasukkan ke array baru bernama c. Namun jika tidak, b dimasukkan terlebih dahulu, kemudian a. Perbandingan ini dilakukan terus menerus sampai array tersusun
void merge( int
arr[], int L, int m1, int m2, int R )
{
int Lidx = L;
int Ridx = m2;
int Cidx = L;
int temparr[ SIZE ];
int i;
while ( Lidx <= m1 && Ridx <=
R ) {
if ( arr[ Lidx ] <= arr[ Ridx ] )
temparr[ Cidx++ ] = arr[ Lidx++ ];
else
temparr[ Cidx++ ] = arr[ Ridx++ ];
}
if ( Lidx == m2 ) {
while ( Ridx <= R )
temparr[ Cidx++ ] = arr[ Ridx++ ];
}
else {
while ( Lidx <= m1 )
temparr[ Cidx++ ] = arr[ Lidx++ ];
}
for ( i=L; i<=R; i++ )
arr[ i ] = temparr[ i ];
}
void mergeSort( int arr[],
int low, int high )
{
int m1, m2;
if ( ( high-low ) >= 1 ) {
m1 = ( low+high ) / 2;
m2 = m1+1;
mergeSort( arr, low, m1 );
mergeSort( arr, m2, high );
merge( arr, low, m1, m2, high );
}
}
Untuk memahami lebih jelas mengenai cara sorting dari tiap teknik di atas, dapat di search di youtube beberapa ilustrasi pengerjaan sorting agar mengerti.
Searching
Dalam suatu data perusahaan besar, pasti ada banyak nama karyawan yang sama, sehingga ketika melakukan searching data, banyak data yang muncul. Oleh karena itu, biasanya diberi penanda yang unik, yaitu key, sehingga hasil yang diinginkan adalah unik.
Ada 2 macam cara searching:
1. Linear Search
Dengan mengecek keseluruhan data dalam satu perusahaan, tanpa perlu di sorting.
Contoh, mencari ID karyawan:
#include<stdio.h>
int main()
{
int IDKaryawan[] = {4,5,6,7,2,3,10,8);
int SearchID;
printf("Input ID Karyawan yang ingin dicari : ");
scanf("%d",&SearchID);
int flag = 0; // penanda data ditemukan atau tidak
for(int i = 0 ; i < 8 ; i++)
{
if(SearchID == IDKaryawan[i]) // jika data ditemukan
{
printf("Found!\n");
flag = 1;
break;
}
}
if(flag == 0)
{
printf("Not Found!\n");
}
return 0;
}
Linear Search dapat berjalan dengan cepat pada jumlah data yang sedikit. Namun, jika datanya mencapai 10000, akan memakan waktu yang cukup lama.
Oleh karena itu, ada teknik Binary Search
2. Binary Search
Prinsip Binary Search adalah membagi data menjadi 2 secara terus menerus. Jika data berada di kiri, maka program akan membagi array bagian kiri menjadi 2 lagi. Jika data berada di sebelah kanan, maka program akan membagi array bagian kanan menjadi 2 lagi.
Oleh karena itu, harus dilakukan sorting terlebih dahulu sebelum melakukan Binary Search.
3. Interpolation Search
Prinsip Interpolation Search mirip dengan Binary Search, harus disorting terlebih dahulu. Namun, ia membagi dengan rumus berikut.
Mid = ((kunci - data[min]) / (data[max] - data[min])) x (max- min) + min
Kunci = data yang ingin dicari
min = index array terkecil
max = index array terbesar
Mid = nilai yang mendekati data yang ingin disearch
Sebagai contoh, dalam pencarian nama dengan huruf awal "T", pasti secara langsung akan mencari pada 3/4 atau 2/3 bagian buku, bukan pada tengah2.