使用堆排序算法(升序,建大堆顶)完善此程序。(注:截图为堆排序初始化后的大堆顶结果,详见源代码)
#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都没反应过来。。。