힙 구성c
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
typedef struct heap
{
int* arr;
int capacity;
int size;
}heap;
void createHeap(heap* p, int count);
void insert(heap* p, int value);
void display(int* arr, int size);
void shiftUp(int* arr, int childIdx);
int extractMax(heap* p);
int main()
{
heap hp;
int count;
printf("힙의 크기 입력: ");
scanf("%d", &count);
createHeap(&hp, count);
insert(&hp, 4);
insert(&hp, 2);
insert(&hp, 8);
insert(&hp, 5);
insert(&hp, 1);
insert(&hp, 99);
insert(&hp, 12);
insert(&hp, 880);
insert(&hp, 88);
insert(&hp, 55);
insert(&hp, 1000);
printf("힙구조로 변환 된 배열: ");
display(hp.arr, hp.size);
printf("최댓값 : %d\n", extractMax(&hp));
printf("최댓값 : %d\n", extractMax(&hp));
printf("최댓값 : %d\n", extractMax(&hp));
printf("최댓값 : %d\n", extractMax(&hp));
printf("최댓값 : %d\n", extractMax(&hp));
free(hp.arr);
return 0;
}
void createHeap(heap* p, int count)
{
p->arr = (int*)malloc(sizeof(int)*count);
p->capacity = count;
p->size = 0;
}
void shiftUp(int* arr, int childIdx)
{
int parentIdx = (childIdx - 1) / 2;
int temp;
if(childIdx != 0 && arr[childIdx] > arr[parentIdx])
{
temp = arr[childIdx];
arr[childIdx] = arr[parentIdx];
arr[parentIdx]= temp;
shiftUp(arr,parentIdx);
}
}
void insert(heap* p, int value)
{
if(p->size == p->capacity)
{
printf("\n\n\t\t 저장 공간이 부족해서 더 이상 저장할 수 없습니다.\n");
printf("\t\t삭제 후 다시 저장하세요\n");
return;
}
p->arr[p->size] = value;
shiftUp(p->arr, p->size);
p->size++;
}
void display(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
void shitfDown(int* arr, int parentIdx, int size)
{
int leftIdx = 2 * parentIdx + 1;
int rightIdx = leftIdx + 1;
int largeIdx = -1;
int temp;
if(leftIdx < size)
largeIdx = leftIdx;
if(rightIdx < size && arr[leftIdx] < arr[rightIdx])
largeIdx = rightIdx;
if(largeIdx != -1 && arr[largeIdx] > arr[parentIdx])
{
temp = arr[largeIdx];
arr[largeIdx] = arr[parentIdx];
arr[parentIdx] = temp;
shitfDown(arr, largeIdx, size);
}
}
int extractMax(heap* p)
{
int delValue = p->arr[0];
p->arr[0] = p->arr[p->size - 1];
p->size--;
shitfDown(p->arr, 0, p->size);
return delValue;
}
Heapify
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
#define ARR_SIZE 10
void shiftDown(int* arr, int parentIdx, int size);
void shiftDown(int* arr, int parentIdx, int size)
{
int leftIdx = 2 * parentIdx + 1;
int rightIdx = leftIdx + 1;
int smallIdx = -1;
int temp;
if(leftIdx < size)
smallIdx = leftIdx;
if(rightIdx < size && arr[leftIdx] > arr[rightIdx])
smallIdx = rightIdx;
if(smallIdx != -1 && arr[smallIdx] < arr[parentIdx])
{
temp = arr[smallIdx];
arr[smallIdx] = arr[parentIdx];
arr[parentIdx] = temp;
shiftDown(arr, smallIdx, size);
}
}
void display(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
void heapify(int* arr, int size)
{
for(int i = size / 2 - 1; i >= 0; i--)
{
shiftDown(arr, i, size);
}
}
int main()
{
int arr[10] = {6, 4, 8, 7, 5, 1, 3, 2, 10, 9};
printf("Original array:");
display(arr, 10);
heapify(arr, 10);
printf("heapify arrary: ");
display(arr, 10);
printf("배열의 최솟값은 %d입니다\n", arr[0]);
return 0;
}
힙 정렬 c
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
#define ARR_SIZE 10
void shiftDown(int* arr, int parentIdx, int size);
void heapSort(int* arr, int size);
void display(int* arr, int size);
void shiftDown(int* arr, int parentIdx, int size)
{
int leftIdx = 2 * parentIdx + 1;
int rightIdx = leftIdx + 1;
int largeIdx = -1;
int temp;
if(leftIdx < size)
largeIdx = leftIdx;
if(rightIdx < size && arr[leftIdx] < arr[rightIdx])
largeIdx = rightIdx;
if(largeIdx != -1 && arr[largeIdx] > arr[parentIdx])
{
temp = arr[largeIdx];
arr[largeIdx] = arr[parentIdx];
arr[parentIdx] = temp;
shiftDown(arr, largeIdx, size);
}
}
void heapSort(int* arr, int size)
{
for(int i = size / 2 -1; i >= 0; i--)
shiftDown(arr, i, size);
for (int i = 9; i >= 1; i--)
{
int temp= arr[0];
arr[0] = arr[i];
arr[i] = temp;
shiftDown(arr, 0, i);
}
}
void display(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
int main()
{
int arr[ARR_SIZE] = {6, 4, 8, 7, 5, 1, 3, 2, 10, 9};
printf("Original array:");
display(arr, 10);
heapSort(arr, 10);
printf("Sorted arrary: ");
display(arr, 10);
return 0;
}
K번째 큰 값찾기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning (disable : 4996)
#define ARR_SIZE 10
void shiftDown(int* arr, int parentIdx, int size);
void heapSort(int* arr, int size);
void display(int* arr, int size);
int largeNumKth(int* arr, int k, int size);
void shiftDown(int* arr, int parentIdx, int size)
{
int leftIdx = 2 * parentIdx + 1;
int rightIdx = leftIdx + 1;
int largeIdx = -1;
int temp;
if (leftIdx < size)
largeIdx = leftIdx;
if (rightIdx < size && arr[leftIdx] > arr[rightIdx])
largeIdx = rightIdx;
if (largeIdx != -1 && arr[largeIdx] < arr[parentIdx])
{
temp = arr[largeIdx];
arr[largeIdx] = arr[parentIdx];
arr[parentIdx] = temp;
shiftDown(arr, largeIdx, size);
}
}
void heapSort(int* arr, int size)
{
for (int i = size / 2 - 1; i >= 0; i--)
shiftDown(arr, i, size);
for (int i = size - 1; i >= 1; i--)
{
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
shiftDown(arr, 0, i);
}
}
void display(int* arr, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
int largeNumKth(int* arr, int k, int size)
{
int* copy = (int*)malloc(sizeof(int) * size);
memcpy(copy, arr, sizeof(int) * size);
heapSort(copy, size);
int kValue = copy[k - 1];
free(copy);
return kValue;
}
int main()
{
int arr[ARR_SIZE] = {6, 4, 8, 7, 5, 1, 3, 2, 10, 9};
int k, kValue;
printf("\n몇 번째로 큰 값을 찾으시겠습니까? ");
scanf("%d", &k);
kValue = largeNumKth(arr, k, 10);
printf("%d번째로 큰 값은 %d입니다.\n", k, kValue);
printf("Original Array: ");
display(arr, 10);
return 0;
}