堆排序原理很简单,这里不再讲述。
C语言实现
#include<stdio.h>
//大根堆,即结果从大到小
void adjust(int a[], int k, int len) {
//调整以k为根的子树
a[0] = a[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && a[i] < a[i + 1]) {
i++;
}//找到a[k]的孩子值较大的下标
if (a[i] <= a[0])break;
else {//把值较大的调整到双亲结点
a[k] = a[i];
k = i;
}
}
a[k] = a[0];
}
//构建堆
void build(int a[], int len) {
for (int i = len / 2; i>0; i--) {
adjust(a, i, len);
}
}
//输出结果,每次输出调整堆
void output(int a[],int len) {
for (int i = len; i > 0; i--) {
printf("%d ", a[1]);
a[1] = a[i];
adjust(a, 1, i - 1);
}
}
int main() {
int num[] = { 100,2,80,3,70,5,4,15,1,7,8,6,10,30,9 };//a[0]不存放数据
int len=(sizeof(num)/sizeof(num[0]))-1;
build(num, len);
output(num, len);
}
Java实现
class heap{
int num[];
int len;
heap(int num[],int len){
this.num=num;
this.len=len;
build();//构建堆
}
public void build() {
int i;
for(i=len/2;i>0;i--) {
adjust(i,len);
}
}
public void adjust(int k,int len) {
num[0]=num[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && num[i] < num[i + 1]) {
i++;
}//找到a[k]的孩子值较大的下标
if (num[i] <= num[0])break;
else {//把值较大的调整到双亲结点
num[k] = num[i];
k = i;
}
}
num[k] = num[0];
}
public void output() {
for(int i=len;i>0;i--) {
System.out.println(num[1]+" ");
num[1]=num[i];
adjust(1,i-1);
}
}
}
public class heapsort {
public static void main(String []args) {
int num[] = { 100,2,80,3,70,5,4,15,1,7,8,6,10,30,9 };//a[0]不存放数据
//构建的是大根堆
int len=num.length-1;
heap h=new heap(num,len);
h.output();
}
}
python实现
def adjust( a, k, length):
a[0]=a[k]
i=2*k
while i<=length:
if i<length and a[i]<a[i+1]:
i=i+1
if a[i]<=a[0]:
break
else:
a[k]=a[i]
k=i
i*=2
a[k]=a[0]
def build( a, length):
i=length/2
while i>0:
adjust(a,i,length)
i=i-1
def output( a, length):
i=length
while i>0:
print(a[1])
a[1]=a[i]
adjust(a,1,i-1)
i=i-1
def main():
num = [100,2,80,3,70,5,4,15,1,7,8,6,10,30,9 ]
length=len(num)-1;
build(num,length)
output(num,length)
main()