
public static void main(String[] args)
{
int[] nums={57,68,59,52};
sort(nums);
}
public static void sort(int[] nums)
{
for (int i = 0; i < nums.length; i++)
{
int min=nums[i];
int n=i;//最小数的索引
for (int j = i+1; j < nums.length; j++)
{
if (nums[j]<min)
{
//找出最小数
min=nums[j];
n=j;
}
}
nums[n]=nums[i];
nums[i]=min;
}
}2、实例
初始序列:46,79,56,38,40,84
建堆:

交换,从堆中踢出最大数

public static void main(String[] args)
{
int[] nums={46,79,56,38,40,84};
int len=nums.length;
//循环建堆
for (int i = 0; i < nums.length-1; i++)
{
//建堆
buildMaxHeap(nums,len-1-i);
//交换堆顶和最后一个元素
swap(nums,0,len-1-i);
System.out.println(Arrays.toString(nums));
}
}
/**
* 对nums数组中0到lastIndex建大顶堆
*/
public static void buildMaxHeap(int[] nums,int lastIndex)
{
//从lastIndex处节点(最后一个节点)的父节点开始
for (int i = (lastIndex-1)/2; i >=0; i--)
{
//k保存正在判断的节点
int k=i;
//如果当前K节点的子节点存在
while (k*2+1<=lastIndex)
{
//k节点的左节点的索引
int binggerIndex=2*k+1;
//如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
if (binggerIndex<lastIndex)
{
//如果右子节点的值较大
if (nums[binggerIndex]<nums[binggerIndex+1])
{
binggerIndex++;
}
}
//如果K节点的值小于其较大的子节点的值
if (nums[k]<nums[binggerIndex])
{
//交换他们
swap(nums, k, binggerIndex);
//将biggerIndex赋予K,开始While循环的下一次,重新保证k节点的值大于其左右子节点的值
k=binggerIndex;
}
else
{
break;
}
}
}
}
public static void swap(int[] nums,int i,int j)
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zzc8265020/article/details/47834943