堆排序的实现

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种, 它是 通过堆来进行选择数据。 需要注意的是排升序要建大堆,排降序建小堆。
大堆模拟实现(示例)

堆排序的实现_第1张图片 

void _AdjustDownByHeapSort(int *ar, int left, int right, int start)
{
	int n = right - left;
	int i = start;
	int j = 2 * i + 1; //左子树

	int tmp = ar[i];
	while(j < n)
	{
		if(j+1ar[j])   //有右子树选取左右子树较大的数
			j++;

		if(tmp < ar[j])
		{
			ar[i] = ar[j];
			i = j;            //向下
			j =  2 * i + 1;
		}
		else
			break;
	}

	ar[i] = tmp;     
}

void HeapSort(int *ar, int left, int right)
{
	//建堆
	int n = right - left;
	int curpos = n/2 - 1 + left;
	while(curpos >= left)
	{
		_AdjustDownByHeapSort(ar,left, right, curpos);
		curpos--;
	}

	//排序
	int end = right - 1;
	while(end > left)
	{
		Swap(&ar[left], &ar[end]);   
		_AdjustDownByHeapSort(ar, left, end, left);   //除去最后一个
		end--;
	}
}
1. 堆排序使用堆来选数,效率就高了很多。(选择过程当中,会将上次选择的结果做一个记录,并不是所有的数据参与选择)
2. 时间复杂度: O(N*logN)
3. 空间复杂度: O(1)
4. 稳定性:不稳定

你可能感兴趣的:(排序,c语言,数据结构,堆排序)