算法学习之一java实现堆排序
来源:互联网 发布:动漫制作软件 编辑:程序博客网 时间:2024/06/05 18:15
堆排序:堆分为最大堆和最小堆。
最大堆:它的值大于它所有的子孙代表的值。
最小堆:它的值小于它所有的子孙代表的值。
插入:将新添加的值,添加到堆的最后位置,然后重新构建堆。
删除:将根节点的值移除,将最后的节点值填补根节点值,然后重新构建堆。
节点i 父节点(i-1)/2 子节点 (left)2*i+1 (right) 2*i+2
堆排序属于非稳定性排序。
以下是代码部分:
package com.scy.arithmetic;import java.util.Arrays;/** * @author suda *堆排序思想:讲给的数组变化成最大堆或者最小堆,然后进行删除操作进行排序。 *插入操作思想:在最后的子节点出添加一个新的节点放入插入的值,然后进行最大堆或最小堆操作 *删除思想:将根节点数去除,然后用最后一个的节点数放在根节点,然后进行最大堆或最小堆操作 */public class StackSort {public static void main(String[] args) {//生成一个随机的20位数组int[] a=new int[20];for (int i = 0; i <20; i++) {a[i]=(int)(Math.random()*(100-1+1)+1);}//打印生成的数组System.out.println(Arrays.toString(a));/*//构建最大堆new StackSort().maxStack(a, a.length-1);System.out.println(Arrays.toString(a));//构建最小堆new StackSort().minStack(a, a.length-1);System.out.println(Arrays.toString(a));//进行堆排序,结果由大到小排列new StackSort().stackSort(a);System.out.println(Arrays.toString(a));*///进行插入操作,构建最大堆new StackSort().maxStack(a, a.length-1);new StackSort().insetStack(a, 80);}//插入新数据,a为最大堆.思想:将新值放到最后的位置public void insetStack(int[] a,int b){int[] c=new int[a.length+1];for (int i = 0; i < a.length; i++) {c[i]=a[i];}c[a.length]=b;maxStack(c, c.length-1);System.out.println(Arrays.toString(c));}//堆排序,又称删除操作,传入的是最大堆或者最小堆public void stackSort(int[] a){for (int i = a.length-1; i >0; i--) {//因为要求从大到小排列,则需要建立最小堆minStack(a, i);int temp=a[0];a[0]=a[i];a[i]=temp;}}//构建最小堆,思想:所有的节点均小于它的子孙节点。public void minStack(int[] a,int len){for (int i = len; i>(len-1)/2; i--) {for (int j = i; j>0; j=(j-1)/2) {for (int j2 =(j-1)/2; j2>=0; j2=(j2-1)/2) {//如果辈分最小的代表数组大于它的祖宗辈所表示的值,则进行值的交换if(a[j]<a[j2]){int temp=a[j];a[j]=a[j2];a[j2]=temp;}if(j2==0){break;}}}}}//构建最大堆,思想:所有的节点均大于它的子孙节点。public void maxStack(int[] a,int len){//只需要将最后一代进行分组,然后分别跟它对应的祖辈进行比较排序for (int i = len; i>(len-1)/2; i--) {//借用选择排序的思想,用最后一个跟它上边的依次比较,让最后一个是最小值。最后一个在移位到上一个的位置继续比较。for (int j = i; j>0; j=((j-1)/2)) {//祖孙数组中的祖宗辈,及爸爸,爷爷,老爷爷。。。知道老祖宗for (int j2 = ((j-1)/2); j2>=0; j2=((j2-1)/2)) {//如果最小的比它的祖宗大,则进行辈分交换if(a[j]>a[j2]){int temp=a[j];a[j]=a[j2];a[j2]=temp;}//如果已经跟祖宗比较完了,则本轮比较if(j2==0){break;}}}}}}
0 0
- 算法学习之一java实现堆排序
- 算法学习之一:堆排序
- 算法学习之一java实现选择排序
- 算法学习之一java实现冒泡排序
- java算法系列之一:堆排序算法
- 《算法导论》学习笔记之一排序算法2--堆排序的 实现代码C++
- 堆排序算法-java实现
- Java实现堆排序算法
- Java实现堆排序算法
- 堆排序算法java实现
- 堆排序算法--Java实现
- 堆排序算法java实现
- 算法(第四版)学习笔记之java实现堆排序
- Java实现排序算法之堆排序
- java实现排序算法之堆排序
- Java实现排序算法2:堆排序
- java实现简单排序算法:堆排序
- 排序算法之堆排序java实现
- Bellman-For判断负权回路
- myeclipse javaWeb项目+JAX-WS webService接口开发
- 欢迎使用CSDN-markdown编辑器
- 维特比算法在分词中的应用
- centos下的压缩解压缩
- 算法学习之一java实现堆排序
- leetcode系列(23)判断整数是不是回文
- uCosIII中使用malloc函数
- emacs org plot 绘图二 折线图
- 求矩阵中的最大二维矩阵
- Java造型中的强制转换
- WDK显卡驱动sample编译和部署
- 显示意图和隐式意图
- 马哥linux2014|2015全套教程