堆排序详解

//堆结构heapify操作实现
void heapify(int arr[], int index, int heapsize)
{
	int left = index * 2 + 1;//左孩子的下标
	while (left < heapsize)//左孩子一直存在
	{
		int largest = (left + 1) < heapsize && arr[left + 1] > arr[left] ? left + 1 : left;
		//两个孩子谁的值大把下标给谁
		largest = arr[largest] > arr[index] ? largest : index;
		if (largest == index)break;
		swap(arr, largest, index);//自定义交换函数
		index = largest;
		left = index * 2 + 1;
	}
}
//堆结构heapinsert操作实现
void heapinsert(int arr[], int index)
{
	while (arr[index] > arr[(index - 1) / 2])
	{
		swap(arr, index, (index - 1) / 2);
		index = (index - 1) / 2;
	}
}
//堆排序
void heap_sort(int arr[])
{
	if (arr == NULL || arr.length < 2)
		return;
	for (int i = 0; i < arr.length; i++)
		heapinsert(arr, i);//把数组变成大根堆;
	int heapsize = arr.length;
	while (heapsize > 0)
	{
		heapify(arr, 0, heapsize);
		swap(arr, 0, --heapsize);
	}
}

你可能感兴趣的:(算法,蓝桥杯,数据结构)