C++, 堆排序

堆排序,是一种不稳定的排序方法,包含两个过程,构建堆和调整堆

构建堆的过程,要从下往上,从右往左;从有孩子的左节点开始往上调整。

构建完成后,交换堆顶元素和堆尾元素,然后对剩余元素重新调整成堆

时间复杂度:

整个堆的构建为O(n)

重建堆的时间复杂度为O(nlogn)

总体来说,堆排序的时间复杂度为O(nlogn)

int num[7] = {2, 3, 4, 5, 2, 3, 1};
int length = 7;
void heapSort(int* num, int len)
{
	for(int i = len/2-1; i >= 0; i--) //由二叉树性质,知道len/2是最后一个包含孩子的节点
		heapAdjust(num, i, len);
		
	for(int i = len-1; i > 0; i--)
	{
		swap(num, 0, i);
		heapAdjustnum, 0, i); //对剩余的[0,i]区间内的元素调整成堆
	}
}
void heapAdjust(int* num, int low, int high)
{
	int tempnum[low];
	for(int j = low*2+1; j < high; j = j*2+1)
	{
		if(j+1 < high && num[j] < num[j+1)
			++j;
		if(temp >= num[j])
			break;
		num[low] = num[j];
		low = j;
	}
	num[low] = temp;
}

猜你喜欢

转载自blog.csdn.net/shidamowang/article/details/80431403