728x90

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct HeapElementType
{
 int value;
} HeapNode;
typedef struct ArrayHeapType
{
 int maxElementCount;  // 최대 노드 개수
 int currentElementCount; // 현재 노드 개수
 HeapNode *pElement;
} ArrayMaxHeap;

void printArr(int value[]);
void heapSort(ArrayMaxHeap *value, int count);
void MaxHeapify(ArrayMaxHeap *value, int i);
void BuildMaxHeap(ArrayMaxHeap *value);
void printArr2(ArrayMaxHeap *value);
void insertionSort(int value[], int count);
void quickSort(int value[], int p, int r);
int partition(int value[], int p, int r);
void MergeSort(int Arr[], int p, int r);
void Merge(int Arr[], int p, int q, int r);
int partitionQuickSort(int value[], int start, int end);

int n;



int main()
{
 int i;
 FILE *fp; //파일포인터 선언
 fp = fopen("input2.txt","r");
 int *p, *p2, *p3; //insertion sort 위한 배열 
 int *pTemp;

 clock_t start, finish;//시작, 종료시간

 if(!fp)  //파일포인터가 널값이라면
 {
  printf("can't read the file\n");
  exit(0); //프로그램종료
 }

 fscanf(fp, "%d", &n); //파일의 첫번째 라인 숫자 읽어옴

 p = (int*)malloc(sizeof(int)*n); //읽어와서 n에 입력된 수만큼 동적할당을 한다. 
 p2 = (int*)malloc(sizeof(int)*n); //읽어와서 n에 입력된 수만큼 동적할당을 한다.
 p3 = (int*)malloc(sizeof(int)*n); //읽어와서 n에 입력된 수만큼 동적할당을 한다.
 ArrayMaxHeap *p4 = (ArrayMaxHeap *)malloc(sizeof(ArrayMaxHeap));
 ArrayMaxHeap *pTemp2 = (ArrayMaxHeap *)malloc(sizeof(ArrayMaxHeap));
 
 pTemp = (int*)malloc(sizeof(int)*n);
 printf("counter = %d\n", n);

 p4->maxElementCount = n;
 p4->currentElementCount = n;
 p4->pElement = (HeapNode *)malloc(sizeof(HeapNode) * (n));
 pTemp2->maxElementCount = n;
 pTemp2->currentElementCount = n;
 pTemp2->pElement = (HeapNode *)malloc(sizeof(HeapNode) * (n));
 memset(p4->pElement, 0, sizeof(HeapNode) * (n));
 memset(pTemp2->pElement, 0, sizeof(HeapNode) * (n));

 for(i=0; i<n; i++)//txt파일의 값을 p, p2 배열에 저장한다.
 {  
  fscanf(fp, "%d", &p[i]);
  p2[i] = p[i];
  p3[i] = p[i];
  p4->pElement[i].value = p[i];
 }

 
 fclose(fp); // 파일포인터 해제

 start = clock();
 insertionSort(p, n); //insertion sort 수행
 finish = clock();
 printArr(p);// insertion sort 된 p 출력
 printf("\n1.insertion sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC);  
 start = clock();
 insertionSort(p, n);
 finish = clock();
 printf("\n2.insertion sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 
 for(i = 0;i<n;i++){
  pTemp[n-i] = p[i];
 }
 start = clock();
 insertionSort(pTemp, n);
 finish = clock();
 printf("\n3.insertion sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 

 
 start = clock();
 quickSort(p2, 0, n-1); // quick sort 수행
 finish = clock(); 
 printArr(p2); // quick sort 된 p2 출력
 printf("\n1.quick sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC);  
 start = clock();
 quickSort(p2, 0, n-1);
 finish = clock();
 printf("\n2.quick sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 
 for(i = 0;i<n;i++){
  pTemp[n-i] = p2[i];
 }
 start = clock();
 quickSort(pTemp, 0, n-1);
 finish = clock();
 printf("\n3.quick sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 
 
 
 
 start = clock();
 MergeSort(p, 0, n-1); // quick sort 수행
 finish = clock(); 
 printArr(p); // quick sort 된 p2 출력
 printf("\n1.merge sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC);  
 start = clock();
 MergeSort(p, 0, n-1);
 finish = clock();
 printf("\n2.merge sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 
 for(i = 0;i<n;i++){
  pTemp[n-i] = p3[i];
 }
 start = clock();
 MergeSort(pTemp, 0, n-1);
 finish = clock();
 printf("\n3.merge sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 


 

 start = clock();
 heapSort(p4, n); // quick sort 수행
 finish = clock(); 
 printArr2(p4); // quick sort 된 p2 출력
 printf("\n1.heap sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC);  
 start = clock();
 heapSort(p4, n);
 finish = clock();
 printf("\n2.heap sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC); 
 for(i = 0;i<n;i++){
  pTemp2->pElement[n-i].value = p4->pElement[i].value;
 }
 start = clock();
 heapSort(pTemp2, n);
 finish = clock();
 printf("\n3.heap sort duration is %f\n", (double)(finish-start)/CLOCKS_PER_SEC);

 /*
 free(p); // free
 free(p2); // free
 free(p3);
 free(p4);
 free(pTemp);
 free(pTemp2);
 */
}

void insertionSort(int value[], int count)
{
 int i = 0, j = 0;
 int temp = 0;

 for(i=0; i<count; i++){
  temp = value[i]; // 삽입 될 값 임시 저장

  for(j=i-1; j>=0; j--){
   if(value[j] > temp){
    value[j+1] = value[j]; // 한 칸씩 우측으로 밀음
   }else
    break;
  }
  value[j+1] = temp;//밀린 자리에 삽입될 값 저장
 }
}

void quickSort(int value[], int p, int r){
 int q;
 if(p < r){
  q = partitionQuickSort(value, p, r); // pivot을 가져옴
  quickSort(value, p, q-1); // recursive 로 좌측
  quickSort(value, q+1, r); // recursive 로 우측
 }
}
/*
int partition(int value[], int p, int r){ // pivot 위치 리턴
 int x = value[r]; // pivot
 int i = p-1;
 int j, temp = 0;
 for(j=p; j<r; j++){ //right의 좌측에서
  if(value[j] <= x){ // pivot보다 작으면
   i = i + 1; //index증가 후 값 교환  
   temp = value[i];
   value[i] = value[j];
   value[j] = temp;
  }
 }
 temp = value[i+1];//pivot 값 교환 후
 value[i+1] = value[r];
 value[r] = temp;
 return i+1;//pivot 인덱스 리턴
}
*/
int partitionQuickSort(int value[], int start, int end)
{
 int pivot = 0;
 int temp = 0, left = 0, right = 0;
 left = start;
 right = end;
 pivot = end;

 while(left < right) {
  while((value[left] < value[pivot]) && (left < right)) {
   left++;
  }
  while((value[right] >= value[pivot]) && (left < right)) {
   right--;
  }

  if (left < right) {
   temp = value[left];
   value[left] = value[right];
   value[right] = temp;

   //printf("start-[%d],end-[%d],pivot-[%d],in-loop,", start, end, value[pivot]);
   //printArray(value, end - start + 1);
  }
 }
 temp = value[pivot];
 value[pivot] = value[right];
 value[right] = temp;

 //printf("start-[%d],end-[%d],pivot-[%d],out-loop,", start, end, value[right]);
 //printArray(value, end - start + 1);

 return right;
}

void printArr(int value[]){
 printf("\nfront 50\n");
 int i;

 for(i=0; i< 50; i++){
  printf("%d ", value[i]); 
 }

 printf("\nrear 50\n");
 for(i=n-50; i<n; i++){
  printf("%d ", value[i]);
 }
}

void MergeSort(int Arr[], int p, int r){
 int q = 0;
 if(p < r){
  q = (p+r)/2;
  MergeSort(Arr,  p, q); // 왼쪽
  MergeSort(Arr,  q+1, r); // 오른쪽
  Merge(Arr, p, q, r); // 하나씩 나눠진 값들을 하나로 합쳐줌.
 }
}


void Merge(int Arr[], int p, int q, int r){
 int n1 = q - p;
 int n2 = r - q - 1;
 int *L = NULL;
 int *R = NULL;
 L = (int*)malloc(sizeof(int)*(n1+2));
 R = (int*)malloc(sizeof(int)*(n2+2));
 //let L[1 ~ n1+1], R[1 ~ n2+1] be new arrays;
 int i, j;
 for(i=0; i<=n1; i++)
  L[i] = Arr[p+i];

 for(j=0; j<=n2; j++)
  R[j] = Arr[q+j+1];
 
  
 L[n1+1] = 100000;
 R[n2+1] = 100000;

 i = 0;
 j = 0;
 int k = 0;
 for(k=p ; k<=r ; k++){  
  if(L[i]<=R[j]){ 
   Arr[k] = L[i];
   i = i+1;
  }else{
   Arr[k] = R[j];
   j = j+1;
  }

  
 }
 free(L);
 free(R);
}

// 힙 정렬.
void heapSort(ArrayMaxHeap *value, int count)
{
 BuildMaxHeap(value); //maxheap 생성
 int temp = 0;
 for(int i=value->currentElementCount; i >= 1; i--){ //heap의 길이부터 1까지
  //0의 값과 i의 값을 exchange - > 마지막으로 옮김
  temp = value->pElement[i].value;
  value->pElement[i].value = value->pElement[0].value;
  value->pElement[0].value = temp;
  value->maxElementCount -=1; // 최대 노드 갯수를 감소한다.
  
  MaxHeapify(value, 0); // maxheapify
 }

}

void MaxHeapify(ArrayMaxHeap *value,int  i){
 int l = 2*i; // 왼쪽 자식
 int r = 2*i+1; // 오른쪽 자식
 int temp =0;
 int largest = 0;

 if((l<=value->maxElementCount) && (value->pElement[l].value > value->pElement[i].value)){ // 왼쪽자식이 크기에 벗어나지 않고 root보다 크면
  largest = l; // 왼쪽 자식이 largest가 된다
 }else{
  largest = i; // 아니면 현재 root가 largest가 된다
 }

 if((r<=value->maxElementCount) && (value->pElement[r].value > value->pElement[largest].value)){ // 오른쪽 자식이 크기에 벗어나지 않고 largest보다 크면
  largest = r; // 오른쪽 자식이 largest가 된다.
 }

 if(largest != i){ // root가 largest가 아닐 경우에는
  //largest의 값과 root의 값을 변경한다.
  temp = value->pElement[largest].value;
  value->pElement[largest].value = value->pElement[i].value;
  value->pElement[i].value = temp;
  //largest값으로 maxheapify 다시 수행
  MaxHeapify(value, largest);
 }
}

void BuildMaxHeap(ArrayMaxHeap *value){ // max heap 생성
 value->maxElementCount = value->currentElementCount; // max값에 현재노드 갯수를 대입
 for(int i=(value->currentElementCount/2); i>0; i--){
  //현재 노드 갯수의 반 부터 하나씩 감소하며 heap 수행
  MaxHeapify(value, i);
 }
}

void printArr2(ArrayMaxHeap *value){
 printf("\nfront 50\n");
 int i;

 for(i=1; i<= 50; i++){
  printf("%d ", value->pElement[i].value); 
 }

 printf("\nrear 50\n");
 for(i=n-50; i<n; i++){
  printf("%d ", value->pElement[i].value);
 }
}

728x90

'Algorithm' 카테고리의 다른 글

topological sort  (0) 2014.10.17
다익스트라 벨만포드 알고리즘  (0) 2014.10.17
php 배열 안장점 소스  (1) 2013.10.31
log3(10) 계산 소스  (0) 2013.10.31
소인수분해 소스  (0) 2013.10.31

+ Recent posts