排序之堆排序
2016-04-25 15:16
155 查看
public class HeapSort {
static int[] MakeMaxHeapUp(int a[],int i,int n){ //用于建立大顶堆,给一个父节点,判断是否满足左右子节点小于父节点
int j,temp;
j=2*i+1;
temp=a[i];
while(j<n){ //节点的位置必须存在
if(j+1<n&&a[j+1]>a[j]) //在右节点存在的条件下,满足右节点大于左节点
j++;
if(a[j]<temp) //使用子节点中较大的那一个和父节点进行比较
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
if(i>0)MakeMaxHeapUp(a, i-1, n);
return a;
}
static void MaxHeapDeleteNumber(int a[],int n){ //取出堆顶元素,即数组中 a[0]元素。
System.out.println(a[0]); //打印堆顶元素
int temp=a[0]; //将堆顶元素与最后一个元素交换。
a[0]=a[n-1];
a[n-1]=temp;
MakeMaxHeapUp(a,0,n-1); //把交换后的堆的前n-1个节点进行大顶堆操作
}
// static void MakeMaxHeapDown(int a[], int n){ //将普通数组进行堆化
// for (int i = n / 2 - 1; i >= 0; i--)
// MakeMaxHeapUp(a, i, n);
// for (int i = 0; i < a.length; i++) { //打印出堆化后的数组元素
// System.out.print(a[i]+" ");
// }
// System.out.println();
// }
public static void main(String[] args) {
int a[] = {6,10,17,8,7,9,12,1};
MakeMaxHeapUp(a,a.length/2-1,a.length);
// MakeMaxHeapDown(a,a.length);
for(int i=a.length;i>0;i--){ //进行循环n次。取出堆顶元素。即完成排序
MaxHeapDeleteNumber(a, i);
}
}
}
以上是使用递归写的堆排序。
以上代码的逻辑是:
1、定义一个数组,将数组进行大顶堆。 依靠的原则是:子节点必须小于父节点。对于一个长度为n的数组来说,最后一个父节点的位置是n/2-1。
2、将大顶堆后的数组第一个位置即a[0]取出,然后将最后一个位置即a[a.length]移动到a[0]。然后再对数组进行大顶堆,重复1、2。
每次都取出堆顶元素,也就是最大的数,最后就可以得到排序后的值。
static int[] MakeMaxHeapUp(int a[],int i,int n){ //用于建立大顶堆,给一个父节点,判断是否满足左右子节点小于父节点
int j,temp;
j=2*i+1;
temp=a[i];
while(j<n){ //节点的位置必须存在
if(j+1<n&&a[j+1]>a[j]) //在右节点存在的条件下,满足右节点大于左节点
j++;
if(a[j]<temp) //使用子节点中较大的那一个和父节点进行比较
break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
if(i>0)MakeMaxHeapUp(a, i-1, n);
return a;
}
static void MaxHeapDeleteNumber(int a[],int n){ //取出堆顶元素,即数组中 a[0]元素。
System.out.println(a[0]); //打印堆顶元素
int temp=a[0]; //将堆顶元素与最后一个元素交换。
a[0]=a[n-1];
a[n-1]=temp;
MakeMaxHeapUp(a,0,n-1); //把交换后的堆的前n-1个节点进行大顶堆操作
}
// static void MakeMaxHeapDown(int a[], int n){ //将普通数组进行堆化
// for (int i = n / 2 - 1; i >= 0; i--)
// MakeMaxHeapUp(a, i, n);
// for (int i = 0; i < a.length; i++) { //打印出堆化后的数组元素
// System.out.print(a[i]+" ");
// }
// System.out.println();
// }
public static void main(String[] args) {
int a[] = {6,10,17,8,7,9,12,1};
MakeMaxHeapUp(a,a.length/2-1,a.length);
// MakeMaxHeapDown(a,a.length);
for(int i=a.length;i>0;i--){ //进行循环n次。取出堆顶元素。即完成排序
MaxHeapDeleteNumber(a, i);
}
}
}
以上是使用递归写的堆排序。
public class HeapSort { static void MakeMaxHeapUp(int a[],int i,int n){ //用于建立大顶堆,给一个父节点,判断是否满足左右子节点小于父节点 int j,temp; j=2*i+1; temp=a[i]; while(j<n){ //节点的位置必须存在 if(j+1<n&&a[j+1]>a[j]) //在右节点存在的条件下,满足右节点大于左节点 j++; if(a[j]<temp) //使用子节点中较大的那一个和父节点进行比较 break; a[i]=a[j]; i=j; j=2*i+1; } a[i]=temp; } static void MaxHeapDeleteNumber(int a[],int n){ //取出堆顶元素,即数组中 a[0]元素。 System.out.println(a[0]); //打印堆顶元素 int temp=a[0]; //将堆顶元素与最后一个元素交换。 a[0]=a[n-1]; a[n-1]=temp; MakeMaxHeapUp(a,0,n-1); //把交换后的堆的前n-1个节点进行大顶堆操作 } static void MakeMaxHeapDown(int a[], int n){ //将普通数组进行堆化 for (int i = n / 2 - 1; i >= 0; i--) MakeMaxHeapUp(a, i, n); for (int i = 0; i < a.length; i++) { //打印出堆化后的数组元素 System.out.print(a[i]+" "); } System.out.println(); } public static void main(String[] args) { int a[] = {6,10,17,8,7,9,12,1}; MakeMaxHeapDown(a,a.length); for(int i=a.length;i>0;i--){ //进行循环n次。取出堆顶元素。即完成排序 MaxHeapDeleteNumber(a, i); } } }这是没有使用递归方法的堆排序。
以上代码的逻辑是:
1、定义一个数组,将数组进行大顶堆。 依靠的原则是:子节点必须小于父节点。对于一个长度为n的数组来说,最后一个父节点的位置是n/2-1。
2、将大顶堆后的数组第一个位置即a[0]取出,然后将最后一个位置即a[a.length]移动到a[0]。然后再对数组进行大顶堆,重复1、2。
每次都取出堆顶元素,也就是最大的数,最后就可以得到排序后的值。
相关文章推荐
- 在命令行用 sort 进行排序
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- 有关数据库SQL递归查询在不同数据库中的实现方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#中的递归APS和CPS模式详解
- C#通过IComparable实现ListT.sort()排序
- WinForm实现按名称递归查找控件的方法
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C语言实现选择排序、冒泡排序和快速排序的代码示例