堆排序。这段代码有什么问题?

时间:2014-07-20 11:03:57

标签: java heapsort

我能够使用函数heapify()创建一个Max Heap但是当我尝试再次调用它(删除max并创建一个已排序的数组)时,程序会卡住/不会停止输入。怎么了?

这是一个内存问题吗?如果我通过增加for循环的频率来增加调用次数,它仍能正常工作。

public class HeapSort 
{
int[] heap;
public void sort(int length)
{
    int temp;
    for(int i=length;i>=1;i--)
    {
        heapify(i,length);
    }
    //if I try to call heapify again(even once) after this,the program gets stuck
}
public void heapify(int i,int l)
{
    int lchild=2*i,rchild,max;
    int temp;
    while(lchild<=l)
    {

            rchild=(2*i)+1;
        if(rchild<=l)
            max=(heap[lchild]>heap[rchild])? lchild:rchild;
        else
            max=lchild;
        if(heap[i]<heap[max])
        {
            temp=heap[i];
            heap[i]=heap[max];
            heap[max]=temp;
            i=max;
        }
        lchild=2*i;
    }

}
public static void main(String args[]) throws  IOException
{
    BufferedReader r= new BufferedReader(new InputStreamReader(System.in));
    int length=Integer.parseInt(r.readLine());
    HeapSort Heap=new HeapSort();
    Heap.heap=new int[length+1];
    for(int i=1;i<=length;i++)
    Heap.heap[i]=Integer.parseInt(r.readLine());
    Heap.sort(length);
    for(int i=1;i<=length;i++)
        System.out.print(Heap.heap[i]+" ");
}

}

2 个答案:

答案 0 :(得分:0)

Heapify应该进行长度/ 2次迭代,因为它就像树结构。 这是一个完整的堆排序代码......这个排序数组的'

public class HeapSort {
public static void main(String[] args) {
    String s[]={"aaaa","dddd","cccc","gggg","bbbbb"};
    AsHeap(s);
    HeapSort(s);
    for(String x:s){
        System.out.println(x);
    }

}
public static void AsHeap(String s[]){
    for( int i = s.length / 2; i >= 0; i-- ){
        DownHeap( s, i, s.length );
    }
}
public static void HeapSort(String[] s){
    for(int i=s.length-1;i>0;i--){
        swap(s,0,i);
        DownHeap(s,0,i);
    }
}
public static int getLeftChildIndex(int i){

    return 2 * i + 1;
}
private static void DownHeap(String[] s, int i, int length) {
    int indexOfChild;
    String temp;
    for(temp=s[i];getLeftChildIndex(i)<length;i=indexOfChild){
        indexOfChild=getLeftChildIndex(i);
        if(indexOfChild !=length-1 && s[indexOfChild].compareTo(s[indexOfChild+1])<0){
            indexOfChild++;
        }
        if(temp.compareTo(s[indexOfChild])<0){
            s[i] = s[indexOfChild];
        } else{
            break;
        }
    }
    s[i] = temp;

}
public static void swap(String s[],int x,int y){
    String temp=s[x];
    s[x]=s[y];
    s[y]=temp;
}

}

答案 1 :(得分:0)

当父级和子级之间没有交换时(即父级大于子级),while循环不会终止。 当父元素更大时,i的值(正好在主方法之上)不会改变。简单地在if块之外取i = max的行[if(heap [i]

另外,有没有学习算法的序列?如果有,请指导我。

谢谢。