package com.sort;
public class heapsort {
public static void main(String[] args) {
int[] a = {1, 4, 3, 5, 2, 7, 12, 45, 13, 754, 124, 754, 6, 32, 45, 1};
heap(a);
for (int b : a) System.out.println(b);
}
public static void heap(int[] a){
for (int i = a.length/2; i >= 0; i--) {
dfs(a,i,a.length);
}
int len = a.length;
for (int i = a.length-1; i > 0 ; i--) {
a[i] ^= a[0];
a[0] ^= a[i];
a[i] ^= a[0];
len--;
dfs(a,0,len);
}
}
public static void dfs(int[] a ,int i,int len){
int left = i*2 +1;
int right = left + 1 ;
int dad = i;
if(left<len && a[left]< a[dad]) dad = left;
if(right<len && a[right]< a[dad]) dad = right;
if(dad != i){
a[i] ^= a[dad];
a[dad] ^= a[i];
a[i] ^= a[dad];
dfs(a,dad,len);
}
}
}
2022.5.8更新
上面写的不好,不容易懂,附上c++的代码,语法和Java一样,code:
#include<bits/stdc++.h>
using namespace std;
long long q[3000001],len;
void swap(long long &a,int &b){
int c=a;a=b;b=c;
}
void push(long long data){
q[++len]=data;
int now = len;
while(now){
int a = now>>1;
if(q[a]>q[now]) swap(q[now],q[a]);
else return;
now = a;
}
}
void pop(){
swap(q[1],q[len]);
len--;
int now = 1;
while((now<<1)<=len){
int a = now << 1;
if(a+1<=len&&q[a+1]<q[a]) a++;
if(q[a]<q[now]) swap(q[a],q[now]);
else return;
now = a;
}
}
//排序的话,遍历push一遍就行了