/**
* 一次建堆的过程
* @param a
*/
public static void createHeap(int[] a,int i,int n){
int temp;
int j=2*i;
int x=a[i];
while(j<=n){
if(a[j]<a[j+1]){
j++;
}
if(a[i]<a[j]){
a[i]=a[j];
i=j;
j=2*i;
}else{
break;
}
}
a[i]=x;
}
/**
* 堆排序
* @param a
*/
public static void heapSort(int[] a,int n){
int temp=0;
for(int i=n/2-1;i>=0;i--){
createHeap(a,i,n);
}
for(int m=n;m>=1;m--){
temp=a[m-1];
a[m-1]=a[0];
a[0]=temp;
createHeap(a,0,m-1);
}
} public static void main(String[] args){
int[] a=new int[]{43,2,5,64,23,1};
heapSort(a,a.length);
System.out.println("--堆排序----");
for(int m : a){
System.out.println(m);
}
}输出结果如下:
--堆排序----
2
1
23
43
5
64为什么打印出的是这们?请高手帮忙高度一下?
* 一次建堆的过程
* @param a
*/
public static void createHeap(int[] a,int i,int n){
int temp;
int j=2*i;
int x=a[i];
while(j<=n){
if(a[j]<a[j+1]){
j++;
}
if(a[i]<a[j]){
a[i]=a[j];
i=j;
j=2*i;
}else{
break;
}
}
a[i]=x;
}
/**
* 堆排序
* @param a
*/
public static void heapSort(int[] a,int n){
int temp=0;
for(int i=n/2-1;i>=0;i--){
createHeap(a,i,n);
}
for(int m=n;m>=1;m--){
temp=a[m-1];
a[m-1]=a[0];
a[0]=temp;
createHeap(a,0,m-1);
}
} public static void main(String[] args){
int[] a=new int[]{43,2,5,64,23,1};
heapSort(a,a.length);
System.out.println("--堆排序----");
for(int m : a){
System.out.println(m);
}
}输出结果如下:
--堆排序----
2
1
23
43
5
64为什么打印出的是这们?请高手帮忙高度一下?
我这里有个例子。没时间帮你调试。
你看看。private void adjust(int r[], int k, int m)
{
int i=k, j=2*i; //将筛选记录暂存
int temp;
while (j<=m ) //筛选还没有进行到叶子
{
if (j<m && r[j]<r[j+1]) j++; //左右孩子中取较大者
if (r[i]>r[j]) break;
else
{
temp = r[i];
r[i] = r[j];
r[j] = temp; //将筛选记录移到正确位置
i=j;
j=2*i;
}
}
} public void heapSort(int r[ ], int n)
{
int i;
int temp;
for (i=n/2; i>=1; i--) //初建堆
{
adjust(r, i, n);
} for (i=n; i>=2; i-- )
{
temp = r[1];
r[1] = r[i];
r[i] = temp; //移走堆顶
adjust(r, 1, i-1); //重建堆
}
}测试代码public static void main(String[] args)
{
int a[]={-1,37,52,98,75,35,21,10,24,9,78,54}; //不用a[0],所以a[0]是-1
int n = a.length - 1;
Sort sort = new Sort();
sort.heapSort(a, n);
for(int i = 1;i <= n; i++)
System.out.print(a[i] + " ");