힙 정렬 (Heap-Sort)
- 힙 정렬의 수행시간은 O(n log n) 이다.
- 삽입 정렬과 같이 내부 정렬이다.( 정렬시 입력 배열의 원소를 초과해 배열 밖에 저장하는 일이 없다)
동작 원리
1. 최대(최소) 힙을 구성한다
2. 루트에 위치한 수와 가장 작은 수를 교환
3. 교환한 수를 제외하고 힙 특성을 유지
4. 2-3의 과정 반복
소스
- #include<stdio.h>
- int * maxheapify(int *,int); // max heap 유지함수
- int * buildmaxheap(int *, int); // heap 만들기 함수
- int * heapsort(int *, int); // heap 정렬함수
- int heapsize;
- int main(void)
- {
- int arr[10] = {69, 10, 30, 2, 16, 8, 31, 30, 35, 70 }; // 초기 입력 값
- int * heap;
- int a = 0;
- for(a= 0;a<10;a++)
- {
- }
- heapsize = sizeof(arr)/sizeof(arr[0]);
- heap = heapsort(arr, heapsize);
- for(a= 0;a<10;a++)
- {
- }
- return 0;
- }
- int * heapsort(int *arr, int size)
- {
- int ch = 0;
- int a = 9;
- int temp = 0;
- int build = 3;
- arr = buildmaxheap(arr,size);
- for(;a > 1; a --) // 루트와 맨끝 노드의 값을 변경
- {
- temp = (*arr);
- (*arr) = (*(arr+a));
- (*(arr+a)) = temp;
- heapsize --;
- arr= maxheapify(arr,0);
- }
- return arr;
- }
- int * buildmaxheap(int * arr, int a)
- {
- int b = a/2 -1;
- for(;b >= 0 ;b--)
- {
- maxheapify(arr,b);
- }
- return arr;
- }
- int * maxheapify(int *arr, int a)
- {
- int left = 0;
- int right = 0;
- int largest = 0;
- int temp = 0;
- int ch = 0;
- if(a == 0)
- {
- left = 1;
- right = 2;
- }
- else
- {
- left = a*2+1;
- right = a*2+2;
- }
- if(left < heapsize && (*(arr+left)) >= (*(arr+a))) // 왼쪽 노드가 더 클때
- largest = left;
- else
- largest = a; // 아니면 루트
- if(right < heapsize && (*(arr+right)) >= (*(arr+largest))) // 오른쪽 노드가 클때
- largest = right;
- if(largest != a) //더 큰값으로 루트를 교환한다.
- {
- temp = (*(arr+a));
- (*(arr+a)) = (*(arr+largest));
- (*(arr+largest)) = temp;
- maxheapify(arr,largest);
- }
- return arr;
- }
결과
'c언어(알고리즘)' 카테고리의 다른 글
| 스택(Stacks) - 연결리스트로 구현(The implementation with the linked lists) (0) | 2016.11.01 |
|---|---|
| 스택(Stacks) - 배열로 구현(The implementation with the array) (0) | 2016.11.01 |
| 퀵 정렬(Quick-Sort) (0) | 2016.11.01 |
| 삽입정렬(Insertion-Sort) (0) | 2016.11.01 |
| 선택정렬(Selection-Sort) (0) | 2016.11.01 |