Metode Sorting - Always Share

Minggu, 30 April 2017

Metode Sorting

METODE SORTING

1.     Bucket Sort
Bucket sort adalah algoritma sorting yang bekerja dengan partisi array ke dalam jumlah terbatas sort. Setiap kotak ini kemudian diurutkan secara individual, baik menggunakan algoritma sorting yang berbeda, atau dengan rekursif menerapkan algoritma bucket sort. Sebuah variasi dari metode ini disebut semacam hitungan tunggal buffered lebih cepat dari jenis cepat dan membutuhkan waktu sekitar waktu yang sama untuk berjalan pada set data.
Contoh algoritma bucket sort dengan Dev-c++
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAX 100
#define INPUT 'i'
#define OUTPUT 'o'
#define _MY_DEBUG
#if defined(_MY_DEBUG)
        #define TRACE_LINE printf("\n\n- Program Statistics :\n1. File : %s\n2.
Date : %s\n3. Time : %s\n",__FILE__,__DATE__,__TIME__);
#else
        #define TRACE_LINE
#endif

void InputOutput(int*, const int, const char);
void BucketSort(int*, const int);
void FreeBuffer(int*);

int main(int argc, char *argv[]) {
        system("COLOR 5");
        int *buffer = NULL, max;
        printf("Implementasi Bucket Sort\nMasukkan jumlah data [MAX:100] : ");
        scanf("%d",&max);
        fflush(stdin);
        if((max > 0) && (max <= MAX)) {
                        buffer = (int*)calloc(max,sizeof(int));
                        InputOutput(buffer,max,INPUT);
                        printf("\nData yang anda masukkan : ");
                        InputOutput(buffer,max,OUTPUT);
                        BucketSort(buffer,max);
                        printf("\nData setelah disorting  : ");
                        InputOutput(buffer,max,OUTPUT);
                        FreeBuffer(buffer);
        }
        TRACE_LINE;
        getch();
        fflush(stdin);
        return(EXIT_SUCCESS);
}

void InputOutput(int* buffer, const int max, const char STAT) {
        int i;
        if('i' == STAT) {
                        for(i = 0; i < max; ++i) {
                                       printf("%d. Data ke-%d : ",(i+1),(i+1));
                                       scanf("%d",&buffer[i]);
                                       fflush(stdin);
                        }
        } else if('o' == STAT) {
                        for(i = 0; i < max; ++i) {
                                       printf("%d ",buffer[i]);
                        }
        }
}

void BucketSort(int* buffer, const int max) {
        int i, j, *count = (int*)calloc(max,sizeof(int));
        for(i = 0; i < max; ++i) {
                        count[i] = 0;
        } for(i = 0; i < max; ++i) {
                        ++(count[buffer[i]]);
        } for(i = 0, j = 0; i < max; ++i) {
                        for(; count[i] > 0; --(count[i])) {
                                       buffer[j++] = i;
                        }
        } FreeBuffer(count);
}

void FreeBuffer(int* buffer) {
        free(buffer);
        buffer = NULL;
}









2.     Radix Sort
Radix sort adalah algoritma non-comparation sort atau pengurutan tanpa perbandingan . metode ini mengklarifikisi sebuah data sesuai dengan kategori urutan tertentu. Dan setiap kategori diurutkan lagi dan seterusnya sesuai dengan kebutuhan. Kemudian bagian2 dari kategori tersebut akan digabungkan kembali.
Catatan : data yang diurutkan pertama kali yaitu berupa input nilai2 yang dimasukkan pertama kali berdasarkan radix pertamanya, lalu diteruskan atau diurutkan lagi berdasarkan radix keduanya, dst…
Pada system decimal radix adalah digit dalam angka decimal. Missal : angka 354 mempunyai 3 digit yaitu 3, 5 dan 4

Contoh algoritma radix sort untuk mengurutkan bilangan bulat positif, dengan jumlah digit maksimal 3 :
313
354
123
321
543
756
834
675
Ø  Pertama kita harus membagi-bagi data sesuai dengan urutan terkanan
Ø  Lihat terlebih dahulu digit yang paling besar untuk menentukan kategori berapa baris data yang akan kita urutkan, dan dicontoh ini nilai digit paling besar yaitu angka 8, sehingga kategori sebanyak 8 baris dan diawali dengan angka 0.

Supaya lebih jelas lihat table dibawah :
Kategori digit 1
0
1
2
3
4
5
6
7
8
isi
-
321
-
313,123,
543
354,834
675
756
-
-

Hasil dari kategori pertama tadi akan digabungkan kembali sesuai dengan penjelasan diatas ;

321
313
123
543
354
834
675
756
Kemdian dilakukan pengkategorian kembali berdasarkan dengan  digit yang ke-2 dengan berpatokan / melihat baris urutan dari pengkategorian yang pertama tadi .

Kategori digit 2
0
1
2
3
4
5
6
7
8
isi
-
313
321,123
834
543
354,756
-
675
-
                                                           
313
321
123
834
543
354
756
675



Selanjutnya hasil dari pengkategorian ke-2 digabungkan kembali sehingga diperoleh :
                                                           
Langkah terakhir yaitu pengkategorian ke-3 berdasar digit ke-3 dengan berpatokan melihat baris urutan pengkategorian ke-2
Kategori digit 3
0
1
2
3
4
5
6
7
8
isi
-
123
-
313,321,
354
-
543
675
756
834

Jadi, hasil akhirnya dapat dituliskan :
123
313
321,
354
543
675
756
834
                                                           
Dari proses2 yang sudah kita kerjakan menggunakan Radix Sort, sangat jelas Radix sort termasuk algoritma pengurutan tanpa pembanding yang bersifat melihat digit2 angka sebagai pengontrolnya. Sebenarnya Radix Sort  dapat diimplementasikan dalam pengurutan bilangan Decimal dan bilangan bit. Namun dalam penggunaannya Radix Sort bisa dimodifikasi untuk mengurutkan data2 negatif & pecahan.

Kelebihan :
Ø  Merupakan algoritma pengurutan yang cepat, mudah dan sangat efektif

Kekurangan :
Ø  pengguaannya terbatas pada kasus2 tertentu dan memerlukan memori tambahan yang besar dalam prosesnya mengkategorikan sebuah data.

Contoh program Radix Sort dengan Dev-C++
//Radix sort;

#include <stdio.h>
#define MAX 20
#define SHOWPASS
#define BASE 10
void print(int *a, int n)
{
  int i;
  for (i = 0; i < n; i++)
    printf("%d\t", a[i]);
}

void radixsort(int *a, int n)
{
  int i, b[MAX], m = a[0], exp = 1;

  //Get the greatest value in the array a and assign it to m
  for (i = 1; i < n; i++)
  {
    if (a[i] > m)
      m = a[i];
  }

  //Loop until exp is bigger than the largest number
  while (m / exp > 0)
  {
    int bucket[BASE] = { 0 };

    //Count the number of keys that will go into each bucket
    for (i = 0; i < n; i++)
      bucket[(a[i] / exp) % BASE]++;

    //Add the count of the previous buckets to acquire the indexes after the end of each bucket location in the array
    for (i = 1; i < BASE; i++)
      bucket[i] += bucket[i - 1]; //similar to count sort algorithm i.e. c[i]=c[i]+c[i-1];

    //Starting at the end of the list, get the index corresponding to the a[i]'s key, decrement it, and use it to place a[i] into array b.
    for (i = n - 1; i >= 0; i--)
      b[--bucket[(a[i] / exp) % BASE]] = a[i];

    //Copy array b to array a
    for (i = 0; i < n; i++)
      a[i] = b[i];

    //Multiply exp by the BASE to get the next group of keys
    exp *= BASE;

    #ifdef SHOWPASS
      printf("\nPASS   : ");
      print(a, n);
    #endif
  }
}

int main()
{
  int arr[MAX];
  int i, n;
  printf("Enter total elements (n <= %d) : ", MAX);
  scanf("%d", &n);
  n = n < MAX ? n : MAX;

  printf("Enter %d Elements : ", n);
  for (i = 0; i < n; i++)
    scanf("%d", &arr[i]);

  printf("\nARRAY  : ");
  print(&arr[0], n);

  radixsort(&arr[0], n);

  printf("\nSORTED : ");
  print(&arr[0], n);
  printf("\n");

  return 0;

}

Tidak ada komentar:

Posting Komentar