堆排序

思想:將數組轉爲二叉樹,調整爲最大堆,然後將第一個數與末尾數交換,在調整最大堆,重複步驟

#include <stdio.h>

//輸出

void print(int array[], int size)
{
	int i = 0;
	for(i = 0; i < size; i++)
	{
		printf("%d ", array[i]);
	}
	printf("\n");
}

//兩數交換

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//調整最大堆
void maxHeapify(int array[], int i, int size)
{
	int left = i * 2 + 1;   		//採用索引值計算,數組第一個下標從0開始
	int right  = i * 2 + 2;
	int max_index = 0;
	if(right >= size || left >= size)	//大於數組大小返回
	{
		return;
	}

	//比較出根、左節點、右節點最大的
	if(array[left] > array[i])
	{
		max_index = left;
	}	
	else
	{
		max_index = i;
	}
	if(array[right] > array[max_index])
	{
		max_index = right;
	}

	//如果最大的不爲根節點,則進行交換,
	//並對進行交換的子節點進行對調整
	if(max_index != i)
	{
		swap(&array[i], &array[max_index]);
		maxHeapify(array, max_index, size);
	}
}

//建立最大堆

void build_max_heap(int array[], int size)
{
	//計算第一個根節點的下標
	int index = (size - 2) / 2;
	int i = 0;

	//從下往上進行根節點遍歷
	for(i = index; i > -1; i--)
	{
		maxHeapify(array, i, size);
	}	
}

void heap_sort(int array[], int size)
{
	//建立最大堆
	build_max_heap(array, size);
	while(size != 1)
	{
		//交換第一個節點和最後一個節點
		swap(&array[0], &array[size - 1]);

		//堆大小減一,因爲最後一個數爲最大,爲已排序的數
		size--;	

		//調整堆
		maxHeapify(array, 0, size);
	}
}

int main()
{
	int array[] = {23, 45, 2, 54, 34, 3, 67, 234, 3, 67, 57};
	heap_sort(array, 11);
	int i = 0; 
	print(array, 11);
	return 0;
}
点赞