一、堆排序的 JAVA 实现
堆排序:是一种树形选择排序,在排序中,将待排序的记录r[1..n]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序中选择关键字最大(或最小)的记录。
下面直接代码实现
package HeapSort; public class HeapingSort { public void HeapSort(int a[]){ CreapHeap(a); for (int i=a.length-1;i>0;--i){ a[0]=a[1]; a[1]=a[i]; a[i]=a[0]; HeapAdjust(a,1,i-1); } for (int i=1;i<a.length;++i){ System.out.println(a[i]); } } public void HeapAdjust(int a[],int mid,int high){ int hc=a[mid]; for (int i=mid*2;i<high;i*=2){ if (i<high&&a[i]<=a[i+1]) //比较2mid 和 2(mid+1),得到这两个中最大的数字,作为下一次比较的值。 i++; if (a[mid]>=a[i]) //比较mid 和 上次比较得到的最大值,若是满足,则就是堆 ,直接结束循环。若是不满足,则进行交换。 break; a[mid]=a[i]; mid=i; } a[mid]=hc; } public void CreapHeap(int a[]){ for (int i=(a.length-1)/2;i>0;--i){ //调整堆, HeapAdjust(a,i,a.length-1); } } public static void main(String[] args) { int[] a=new int[]{0,38,65,97,76,13,27,49}; new HeapingSort().HeapSort(a); }
3、算法分析:
a、时间复杂度:O(nlog2n)
b、空间复杂度:O(1)
4、算法特点
a、是不稳定的排序
b、只能用于顺序结构,不能用于链式