堆排序--採用快速排序(利用大堆實現升序,小堆實現降序)

    對堆進行排序,利用大堆實現升序,小堆實現降序。例如升序的實現,將較大數據存放在最後面,依次往前存放數據。具體爲交換第一個元素和最後一個元素,再將不包含最後一個元素的堆進行下調,使堆保持大堆,將最大數據存放在堆中第一個位置,循環執行上述步驟,直到需要下調的數據個數爲0.

void AdjustDown(int *a, size_t root, size_t size)//下調--k爲數組下標,size爲數組元素個數
{//大堆
	size_t parent = root;
	size_t child = parent * 2 + 1;
	while (child < size)
	{
		if (child + 1 < size && a[child] < a[child + 1])
		{
			++child;
		}
		if (a[parent] < a[child])
		{
			swap(a[parent], a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else//注意不滿足交換條件時跳出本次循環
		{
			break;
		}
	}
}
void HeapSort(int *a, size_t size)//堆排序--採用快速排序(利用大堆實現升序,小堆實現降序)
{
	assert(a);
	for (int i = ((int)size-2)/2; i >= 0; --i)//建堆
	{
		AdjustDown(a, i, size);//下調i爲堆頂的堆
	}
	for (size_t i = 0; i < size; ++i)
	{//由於該堆爲大堆,則把第一個元素和最後一個元素進行交換,再進行下調
		swap(a[0], a[size - 1 - i]);//交換堆頂數據和最後一位的數據,使最後一個元素存放最大(小)數
		//size-1-i爲進行下調的元素個數,每交換一次減1,使最後一個元素不參與下調,下調使堆頂存放size-1-i個數中最大(小)數
		AdjustDown(a, 0, size - 1 - i);
	}
}

測試用例如下:

void Test()
{//堆排序
	int arr[] = { 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 };
	size_t size = sizeof(arr) / sizeof(arr[0]);
	HeapSort(arr, size);
	for (size_t i = 0; i < size; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章