排序算法:3.选择排序之堆排序

//构造初始堆(大根堆)
void shift(int a[], int  low, int high)
{
	int i = low;
	int j = 2 * i;//a[j]是a[i]的左孩子
	int temp = a[i];
	while (j <= high)
	{
		if (j < high&&a[j] < a[j + 1])
			j++;//若右孩子较大,j指向右孩子
		if (temp < a[j])
		{
			a[i] = a[j];//将a[j]调整到父亲节点上
			i = j;      //修改i和j的值,一边继续向下筛选
			j = 2 * i;
		}
		else
			break;//筛选结束
	}
	a[i] = temp; //被筛选结点的值放入最终位置 
}

构造初始堆(大根堆)相关图

//堆排序算法
void heapsort(int a[], int n)
{
	int i;
	int temp;
	//循环建立初始堆   
	for (i=n/2; i>=1; --i)        
		shift(a,i,n); 
	//选最大值后并调整堆
	for (i = n ; i >= 2; --i)
	{
		temp = a[1];
		a[1] = a[i];
		a[i] = temp;
		shift(a, 1, i - 1);
	}
}
void main()
{
	//构造初始堆时j=2*i(所以i不能为零),下面数组第一个值不算,注意求得n值
	int a[10] = { 0,6,8,7,0,1,3,2,4,5 };
	int n = sizeof(a)/sizeof(a[0])-1;
	
	heapsort(a,n);
	for (int i = 1; i < n+1; i++)
	{
		cout << a[i] << " ";
	}

}



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页