Tuesday, November 29, 2011

Shell Sort dalam bahasa 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

// int CheckForBadSorting(int*, const int);
void ShellSortPass(int*, const int, const int);
void ShellSort(int*, const int);
void InputOutput(int*, const int, const char);
void FreeBuffer(int*);

int main(int argc, char* argv[]) {
 system("COLOR 5");
 int *buffer = NULL, max;
 printf("Implementasi Shell 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);
  ShellSort(buffer,max);
  printf("\nData setelah disorting : ");
  InputOutput(buffer,max,OUTPUT);
  FreeBuffer(buffer);
  /* if(CheckForBadSorting(buffer,max)) {
   goto MARK;
  } else {
   InputOutput(buffer,max,OUTPUT);
  } */
 } /* MARK : if(buffer != NULL) {
  FreeBuffer(buffer);
 } */
 TRACE_LINE;
    getch();
    fflush(stdin);
    return(EXIT_SUCCESS);
}

/* int CheckForBadSorting(int* buffer, const int max) {
 int i;
 for(i = 1; i < max; ++i) {
  if(buffer[i-1] > buffer[i]) {
   printf("Bad Sorting!");
   return(1);
  }
 }
 return(0);
} */

void ShellSortPass(int* buffer, const int max, const int interval) {
 int i;
    for(i = 0; i < max; ++i) {
        int j, tmp = buffer[i];
        for(j = i-interval; j >= 0; j -= interval) {
            if(buffer[j] <= tmp) {
             break;
            } buffer[j+interval] = buffer[j];
        } buffer[j+interval] = tmp;
 }
}

void ShellSort(int* buffer, const int max) {
 int CiuraIntervals[] = {701, 301, 132, 57, 23, 10, 4, 1},
 IntervalIdx = 0, interval = CiuraIntervals[0];
    double ExtendCiuraMultiplier = 2.3;
    if(max > interval) {
     while(max > interval) {
      --IntervalIdx;
            interval = (int)(interval*ExtendCiuraMultiplier);
        }
    } else {
        while(max < interval) {
            ++IntervalIdx;
            interval = CiuraIntervals[IntervalIdx];
        }
    }
    while(interval > 1) {
        ++IntervalIdx;
  if(IntervalIdx >= 0) {
   interval = CiuraIntervals[IntervalIdx];
  } else {
   interval = (int)(interval/ExtendCiuraMultiplier);
  } ShellSortPass(buffer,max,interval);
    }
}

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 FreeBuffer(int* buffer) {
 free(buffer);
 buffer = NULL;
}

1 comment:

  1. Artikelnya menarik kak, ini saya juga punya artikel tentang Bubble Sort, semoga dapat saling melengkapi

    Bubble Sort dalam Bahasa C (Materi + Koding)

    ReplyDelete