티스토리 뷰
목차
반응형
C언어 힙, 선택, 삽입, 버블, 쉘, 합병, 퀵 정렬 소스 코드 (7종류)
7개의 정렬법
7개의 정렬이란, 선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬입니다. 정수 20만개 까지만 받도록 설정해 놨고, 아래의 그림은 18만개의 정수를 입력받아 정렬시킨 결과입니다.
[C언어 선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬] 예제 소스 코드
C언어 정렬 예제 소스 코드 - c.zip [클릭]
7개 정렬 소스 공통 부분 (선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_SIZE 1000000 #define SWAP(x, y, t) ( (t)=(x), (x)=(y), (y)=(t) ) //x와 y의 위치를 temp값을 이용해 서로 바꿈 #define MAX_ELEMENT 200000 //히프 정렬 최대값 typedef struct { int key; } element; typedef struct { element heap[MAX_ELEMENT]; int heap_size; } HeapType; int sorted[MAX_SIZE]; //합병정렬을 사용하기 위한 추가공간 | cs |
1. C언어 선택정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 | //선택정렬 void selection_sort(int* list[], int n) { int i, j, least, temp; for(i = 0; i < n-1 ; i++) { least = i; for (j = i + 1; j < n; j++) //j값은 항시 i가 가리키는 다음값부터 반복한다. if(list[j] < list[least]) least = j; //이전값이 지금 가리키는 값보다 작다면 SWAP(list[i], list[least], temp); //SWAP함수를 이용해 바꾸어준다. } } | cs |
[C언어 선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬] 예제 소스 코드
2. C언어 삽입정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //삽입정렬 void insertion_sort(int* list[], int n) { int i=0, j=0, key; for (i = 1 ; i < n ; i++) { key = list[i]; for(j = i-1 ; j >= 0 && list[j]>key ; j--) list[j+1] = list[j]; list[j+1] = key; } } | cs |
3. C언어 버블정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 | //버블정렬 void bubble_sort(int* list[], int n) { int i, j, temp; for (i = n-1 ; i > 0 ; i--) { for (j = 0 ; j < i ; j++) //j의 값은 0부터 시작하여 i값과 마주칠때까지 반복한다. if (list[j] > list[j+1]) SWAP (list[j], list[j+1], temp); } } | cs |
4. C언어 쉘정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //쉘 정렬 inc_insertion_sort(int* list[], int first, int last, int gap) { int i, j, key; for (i = first+gap; i <= last; i = i + gap){ key = list[i]; for(j = i - gap ; j >= first && key < list[j] ; j = j - gap) list[j+gap] = list[j]; list[j+gap] = key; } } void shell_sort( int* list[], int n ) { int i, gap; for (gap = n/2 ; gap > 0 ; gap = gap / 2 ) { if( (gap%2) == 0 ) gap++; for(i=0; i<gap; i++) inc_insertion_sort(list, i, n-1, gap); } } | cs |
[C언어 선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬] 예제 소스 코드
5. C언어 합병정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //합병정렬 void merge(int list[], int left, int mid, int right) { int i, j, k, l; i = left; j=mid+1; k=left; while(i<=mid && j<=right){ if(list[i]<=list[j]) sorted[k++] = list[i++]; else sorted[k++] = list[j++]; } if (i>mid) for(l=j ; l<=right; l++) sorted[k++] = list[l]; else for(l=i ; l<=mid ; l++) sorted[k++] = list[l]; for(l=left ; l<=right ; l++) list[l] = sorted[l]; } void merge_sort(int list[], int left, int right) { int mid; if(left<right){ mid = (left+right)/2; merge_sort(list, left, mid); merge_sort(list, mid+1, right); merge(list, left, mid, right); } } | cs |
6. C언어 퀵정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //퀵정렬 int partition(int* list[], int left, int right) { int pivot, temp; int low, high; low = left; high = right+1; pivot = list[left]; do{ do low++; while(low <= right && list[low] < pivot); do high--; while(high >= left && list[high] > pivot); if(low } while(low SWAP(list[left], list[high], temp); return high; } void quick_sort(int* list[], int left, int right) { if(left<right){ int q=partition(list, left, right); quick_sort(list, left, q-1); quick_sort(list, q+1, right); } } | cs |
7. C언어 힙정렬 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | //히프정렬 void insert_max_heap(HeapType *h, element item) { int i; i = ++(h->heap_size); while((i != 1) && (item.key > h->heap [i/2].key)) { h->heap[i] = h -> heap[i/2]; i /= 2; } h->heap[i] = item; } element delete_max_heap(HeapType *h) { int parent, child; element item, temp; item = h->heap[1]; temp = h->heap[(h->heap_size)--]; parent = 1; child = 2; while(child <= h->heap_size) { if( ( child < h->heap_size ) && (h->heap[child].key) < h->heap[child+1].key) child++; if( temp.key >= h->heap[child].key ) break; h->heap[parent] = h->heap[child]; parent = child; child *= 2; } h->heap[parent] = temp; return item; } init (HeapType *h) { h->heap_size = 0; } void heap_sort(element list[], int n) { int i; HeapType h; init(&h); for(i = 0; i < n ; i++) insert_max_heap(&h, list[i]); for(i=(n-1) ; i >= 0 ; i--){ list[i] = delete_max_heap(&h); } } | cs |
[C언어 선택정렬, 삽입정렬, 버블정렬, 쉘정렬, 합병정렬, 퀵정렬, 힙정렬] 예제 소스 코드
마지막, 시간 확인 소스 코드. Main() 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | void main() { int *jung; element *jung2; int i, rn; double timeu = 0, timen = 0; double timeSel, timeIns, timeBub, timeShe; double timeMar, timeQui, timeHeap, timeRad; int count = 0; FILE *fp; //data.txt에 입력받을 파일포인터 FILE *fo; //data.txt에서 값을 받아올 파일포인터 srand( (unsigned)time(NULL) ); fp = fopen("data.txt" ,"w"); printf("몇 개의 랜덤한 정수를 입력받겠습니까 : "); scanf("%d", &count); for(i=0 ; i < count ; i++) { rn=rand()%count; fprintf(fp, "%d ", rn); } fclose(fp); fo = fopen("data.txt" ,"r"); jung = (int *)malloc(sizeof(int)*count); //동적메모리 할당 for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //선택정렬 시간체크 timeu = clock()/1000.0; selection_sort(jung, count); timen = clock()/1000.0; timeSel = timen-timeu; rewind(fo); //파일포인터를 처음으로 for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //삽입정렬 시간체크 timeu = clock()/1000.0; insertion_sort(jung, count); timen = clock()/1000.0; timeIns = timen-timeu; rewind(fo); for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //버블정렬 시간체크 timeu = clock()/1000.0; bubble_sort(jung, count); timen = clock()/1000.0; timeBub = timen-timeu; rewind(fo); for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //쉘정렬 시간체크 timeu = clock()/1000.0; shell_sort(jung, count); timen = clock()/1000.0; timeShe = timen-timeu; rewind(fo); for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //합병정렬 시간체크 timeu = clock()/1000.0; merge_sort(jung, 0, count-1); timen = clock()/1000.0; timeMar = timen-timeu; rewind(fo); for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung[i]); } //퀵정렬 시간체크 timeu = clock()/1000.0; quick_sort(jung, 0, count-1); timen = clock()/1000.0; timeQui = timen-timeu; rewind(fo); //히프정렬 시간체크 jung2 = (int *)malloc(sizeof(int)*count); for (i = 0 ; i < count ; i++) { fscanf(fo, "%d", &jung2[i].key); } timeu = clock()/1000.0; heap_sort(jung2, count); timen = clock()/1000.0; timeHeap = timen-timeu; //기수정렬 시간체크 printf("\n\n\n%d개의 정수를 정렬하는데에 걸리는 시간은. \n\n선택정렬 : %lf초\n삽입정렬 : %lf초\n버블정렬 : %lf초\n 쉘 정렬 : %lf초\n합병정렬 : %lf초 \n퀵 정렬 : %lf초\n히프정렬 : %lf초\n", count, timeSel, timeIns, timeBub, timeShe, timeMar, timeQui, timeHeap); fclose(fo); free(jung); } | cs |
C언어 힙, 선택, 삽입, 버블, 쉘, 합병, 퀵 정렬 소스 코드 (7종류)
반응형