经典排序算法——堆排序(基本算法之一)

来源:互联网 发布:g92内螺纹编程实例解释 编辑:程序博客网 时间:2024/06/06 05:07

因为最近搞堆排序发现,网上有一些代码的思想没错,,但是角标的处理上 有一些瑕疵。。。。所以就想自己写一个


堆排序主要的思想就是将角标看作是一个完全二叉树,这里不懂的话建议去补一补数据结构

所以树的跟节点为0,

左节点是 2i+1

右节点是 2i+2

然后利用递归的思想,将这棵完全二叉树每一个小分支上最大的一个节点浮上去,最后,保证根节点是现有数据里面最大的那个数字,再将这个节点放在未确定的前一半数组中的最后一个,然后一次一次的迭代加递归,,

数据量较少的时候建议不要用,,跟其他方法差不了多少,,,,


代码如下


public void heapSort(int[] arg){

if(arg.length<=1){ return;}

int size = arg.length   

buildHeap(arg, size);

for(int i = size - 1 ; i>=1 ; i--){     //  从1开始,是因为0角标的数字永远都是我们经过调整之后 最大的那个

swap(arg, 0, i);              //   这样就可以把每次未调整的数据中最大的数组挪到被调整的这一批数字中的最后一个

adjustHeap(arg, 0, i);    //因为每次都是将树根放到后面,所以这里一直是0

}


private void buildHeap(int[] arg, int size){

int startRoot = (size-1)/2

for(int i = startRoot ; 1>=0 ; i--){

adjustHeap(arg, i , size);

}

}


private void adjustHeap(int[] arg, int index, int size){

int max = index;

int left = index*2+1;

int right = index*2+2;

if(left<size && arg[left] > arg[max]){

max = left;

}

if(right<size && arg[right] > arg[max]){

max = right;

}

if(max!=index){

swap(arg, index, max);

adjustHeap(arg, max, size);       //这里因为不知道是左子树上去了   还是右子树上去了,所以就用max记录

}

}


private void swap(int[] arg, int index, int index2){

int temp = arg[index];

arg[index] = arg[index2];

arg[index2] = temp;

}

原创粉丝点击