使用堆排序算法

发布时间:2023年12月17日

使用堆排序算法(升序,建大堆顶)完善此程序。(注:截图为堆排序初始化后的大堆顶结果,详见源代码)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 10

void input(int a[], int n);
void output(int a[], int n);
void sort(int a[], int n);
void heapadjust(int a[], int loc, int n);

int main(void)
{
	int a[N];
	input(a, N);
	sort(a, N);
	output(a, N);
	return 0;
}

void input(int a[], int n)
{
	int i;
	printf("Input:\n");
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
}

void output(int a[], int n)
{
	int i;
	printf("Output:\n");
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

void sort(int a[], int n)
{
	int i;
	//int temp; 
	
	//将原始序列初始化为大堆顶 
	for (i = (n-1)/2; i >= 0; i--)
	{
		heapadjust(a, i, n-1); 
	} 
	/* 
	//本段程序是交换第一个和当前最后一个,然后再调整为堆,取消注释则是完整排序算法
	for (i = n - 1; i >= 1; i--)
	{
	temp = a[0];
	a[0] = a[i];
	a[i] = temp;
	heapadjust(a, 0, i-1); 
	} 
	*/ 
}

void heapadjust(int a[], int loc, int n)
{
	/******start******/
	int t;
	int left=2*loc+1, right=2*loc+2;
	int large = loc;
	if (left<n && a[left]>a[large]) {
		large = left;
	}
	if (right<n && a[right]>a[large]) {
		large = right;
	}
	//最大值不是根结点
	if (large != loc) {
		t = a[large];
		a[large] = a[loc];
		a[loc] = t;//交换一下
		heapadjust(a,large,n);//调整子树
	}
	/******end******/
}

???????? 六级考炸了。回想这一年真没有好好碰英语,全靠考前突击了三天,背小红书上的单词和句型。听力果然一个都没听出来,对答案的时候发现臆想的几个答案全是错的,不如直接按首先念的某些单词选选项。早知道去年就把六级过了,这一年英语已经返祖了,那天背单词连language都没反应过来。。。

文章来源:https://blog.csdn.net/google20/article/details/135039781
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。