#include<cstdio>
#include<cstdlib>
#include<iostream>
#define INIT_ARRAY_SIZE 50
using namespace std;
int heap_size;
int heap_cap_size;
void build_heap(int array[], int length);
void max_heap_adjust(int array[], int index);
void heap_delete(int array[], int value);
void heap_insert(int** array, int value);
void heao_sort(int aray[], int length);
int left(int index)
{
return ((index << 1) + 1);
}
int right(int index)
{
return((index << 1) + 2);
}
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
return;
}
void build_heap(int array[], int length)
{
heap_size = length;
for (int i = ((heap_size - 1) >> 1); i >= 0; --i)
{
max_heap_adjust(array, 1);
}
}
void max_heap_adjust(int array[], int index)
{
int left_index = left(index);
int right_index = right(index);
int largest = index;
if (left_index <= (heap_size - 1) && array[left_index] > array[largest])
{
largest = left_index;
}
if (right_index <= (heap_size - 1) && array[right_index] > array[largest])
{
largest = right_index;
}
if (largest == index)
{
return;
}
else
{
swap(&array[index], &array[largest]);
max_heap_adjust(array, largest);
}
}
void heap_delete(int array[], int value)
{
int index = 0;
for (index = 0; index < heap_size; index++)
{
if (array[index] == value)
{
break;
}
}
array[index] = array[heap_size - 1];
--heap_size;
max_heap_adjust(array, index);
}
void heap_insert(int** array, int value)
{
int index = 0;
int parent_index = 0;
if (heap_size + 1 > heap_cap_size)
{
*array = (int*)realloc(*array, 2 * INIT_ARRAY_SIZE * sizeof(int));
}
(*array)[heap_size] = value;
index = heap_size;
heap_size++;
while (index)
{
parent_index = ((index - 1) >> 1);
if ((*array)[parent_index] < (*array)[index])
{
swap(&((*array)[parent_index]), &((*array)[index]));
}
index = parent_index;
}
}
void heao_sort(int array[], int length)
{
int old_heap_size = heap_size;
int i;
for (i = length - 1; i >= 1; --i)
{
swap(&array[i], &array[0]);
--heap_size;
max_heap_adjust(array, 0);
}
heap_size = old_heap_size;
}
void print_array(int* a, int length)
{
for (int i = 0; i < length; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}
int main(int argc,char* argv[])
{
int i = 0;
int a[] = { 9,3,7,6,5,1,10,2 };
int *array = NULL;
array = (int *)malloc(INIT_ARRAY_SIZE * sizeof(int));
int length = sizeof(a) / sizeof(int);
for (i = 0; i < length; ++i)
{
array[i] = a[i];
}
printf("原始数组为\n");
print_array(array, length);
printf("堆得建立后的数组为\n");
build_heap(array, length);
print_array(array, length);
printf("堆排序后的数组为\n");
heao_sort(array, length);
print_array(array, length);
build_heap(array, length);
printf("删除数据10后的数组为\n");
heap_delete(array, 10);
length--;
print_array(array, length);
printf("插入数据10后的数组为\n");
length++;
heap_insert(&array, 10);
print_array(array, length);
printf("堆排序后的数组为\n");
heao_sort(array, length);
print_array(array, length);
return 0;
}
关于堆得相关操作
最新推荐文章于 2021-12-08 19:16:07 发布