(第18讲)堆排序

堆排序利用了堆的数据结构,其基本思想是:

使用普通的新增将数据增加到数组中(无序的);然后利用向下筛选的方法将数组实现堆的形式;最后将堆中的数据一个个移除出来,即为排好序的数组。

程序如下:

/**
 * 堆排序:将数据无序的添加进入数组;
 * 再将数组转化成堆;
 * 再依次从堆中删除到数组
 */
package com.twelve;


public class HeapSortApp {


public static void main(String[] args) {
int size = 10;
Heap1 heap = new Heap1(size);
int[] arr = {81 ,0 ,86, 69 ,50, 81, 14, 94, 33, 64 };
//将无序的10个数添加入数组
for(int i=0; i<size; i++){
//int value = (int) (Math.random()*100);
Node1 node = new Node1(arr[i]);
heap.insert(i, node);
heap.insertArr();
}
heap.displayArr(); 
//将无序的数组转为堆
for(int i=size/2-1; i>=0; i--){
heap.trickleDown(i);
}
heap.displayArr();heap.displayHeap();
//将堆中数据删除到数组:将堆中最大的数据移除,添加到数组的最后
for(int i=size-1; i>=0; i--){
//Node1 bignode = heap.delete();
//heap.insert(i, bignode);
                       
       Node1 biggestNode = heap.delete();
       heap.insert(i, biggestNode);
       }
heap.displayArr(); 
}


}
//结点类
class Node1{
private int data;
public int getData(){
return data;
}
public void setData(int value){
data = value;
}
public Node1(int data){
this.data = data;
}
}
//堆类
class Heap1{
private Node1[] heapArr;
private int curlen;
private int arrlen;
public Heap1(int size){
arrlen = size;
heapArr = new Node1[arrlen];
curlen = 0;
}
//增:在指定位置增加结点
public void insert(int index,Node1 newnode){
heapArr[index] = newnode;
}
//数组增
public void insertArr(){
curlen++;

//删
public Node1 delete(){
Node1 root = heapArr[0];
heapArr[0] = heapArr[--curlen];
trickleDown(0);
return root;
}
//向下筛检
public void trickleDown(int index){
Node1 temp = heapArr[index];
while(index<curlen/2){
int left = index*2+1;
int right = left+1;
int larger = 0;
if(right<curlen && heapArr[left].getData()<heapArr[right].getData())
larger = right;
else
larger = left;
if(temp.getData()>=heapArr[larger].getData())
break;

heapArr[index] = heapArr[larger];
index = larger;
}
heapArr[index] = temp;
}
//遍历数组
public void displayArr(){
for(int i=0;i<arrlen;i++){
System.out.print(heapArr[i].getData()+" ");
}
System.out.println();
}
//遍历堆
public void displayHeap(){
int blank = 32;
int numsperrow = 1;//每一行的元素个数
int itempre = 0;//每一行的第一个元素
int j = 0;//整个堆的元素个数
String dot = "................................";
System.out.println(dot+dot);
while(curlen>0){
if(itempre == 0){//如果是第一个元素,则在该元素前添加空格
for(int i=0;i<blank;i++)
System.out.print(" ");
}
System.out.print(heapArr[j].getData());//输出该元素
if(++j==curlen)//如果元素已经输出完,跳出
break;
if(++itempre == numsperrow)//如果一行的元素已经输出完毕
{
blank /= 2;
numsperrow *= 2;
itempre = 0;
System.out.println();
}else{//否则输出空格
for(int i=0;i<blank*2-2;i++)
System.out.print(" ");

}
}
System.out.println("\n"+dot+dot);
}
}
结果是:

81 0 86 69 50 81 14 94 33 64 
94 81 86 69 64 81 14 0 33 50 
................................................................
                                94
                81                              86
        69              64              81              14
    0      33      50
................................................................
0 14 33 50 64 69 81 81 86 94 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值