第一次:是没注意到线下比较的时候起始节点也会边
#include<stdio.h>
void swap(int&a,int&b){
int temp=a;
a=b;
b=temp;
}
void creatheap(int *data,int n){
for(int i=(n-2)/2;i>=0;i--){
for(int j=i;2*j+1<=n-1;){
j=2*j+1;
if(j+1<n&&data[j]>data[j+1]) j++;
if(data[(j-1)/2]>data[j]) {//注意这里是哪两个的值互换,第一次是i与j,第二次呢?
swap(data[(j-1)/2],data[j]);
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int data[n];
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
}
creatheap(data,n);
for(int i=0;i<n;i++) printf("%d ",data[i]);
return 0;
}
第二次:
import java.util.Scanner;
public class Main {
private static int times = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = in.nextInt();
}
heap(data,n);
for(int i=0;i<n;i++) System.out.print(data[i]+" ");
}
public static void heap(int[] data, int n) {
for (int i = (n - 2) / 2; i >= 0; i--) {
for (int j = i; j * 2 + 1 < n;) {
j = 2 * j + 1;
if (j + 1 < n && data[j + 1] < data[j])
j++;
if (data[j] < data[(j - 1) / 2]) {
int temp = data[j];//不要小看这个转换值,不认真也会错
data[j]=data[(j - 1) / 2];
data[(j - 1) / 2]=temp;
}else break;
}
}
}
}