排序算法(七) 堆排序

来源:互联网 发布:编程器使用方法 编辑:程序博客网 时间:2024/06/04 19:21
package study;public class SortNumberTest {           public static void main(String[] args) {        Test1();    }    public static void Test1(){        System.out.println("堆排序");    int[] numbers8={5, 3, 6, 2, 1, 9, 4, 8, 7};    heapSort(numbers8);    System.out.println("...................................");        }    //堆排序    public static void heapSort(int[] numbers) {      print(numbers);          createMaxdHeap(numbers);          for (int i = 0; i < numbers.length-1; i++) {          Maxify(numbers,numbers.length-1-i,0);            swap(numbers, 0, numbers.length - 1 - i);              print2(numbers);          }      }          private static void createMaxdHeap(int[] numbers){        for (int i = numbers.length/ 2-1; i >= 0; i--) {  //取值依据:若总数为n,则取最后一个有子节点的元素 n/2,需要换算成下标从0开始的情况        Maxify(numbers,numbers.length-1,i);        }    }      private static void Maxify(int[] numbers, int lastIndex,int k) {          // 若当前节点的子节点存在(至少存在左节点)        while (2 * k + 1 <= lastIndex) {  //取值依据,第n个元素,左节点是2n,右节点是2n+1,需要换算成下标从0开始的情况            int biggerIndex = 2 * k + 1;  //左节点            if (biggerIndex < lastIndex) {  //判断右节点是否存在                if (numbers[biggerIndex + 1]<numbers[biggerIndex] ) {                      // 小根堆取较小值                    biggerIndex++;                  }              }              // 如有必要调整顺序,否则已不必再往下比较             if (numbers[k] > numbers[biggerIndex]) {                  print2(numbers);                  swap(numbers, k, biggerIndex);                  k = biggerIndex;              } else {                  break;            }          }      }        private static void swap(int[] numbers, int a, int b) {    int t = numbers[a];    numbers[a] = numbers[b];    numbers[b] = t;    }      private static void  print(int[] numbers){    for (int i = 0; i < numbers.length; i++) {           System.out.print(numbers[i]+" ");        }        System.out.println();    }        //打印堆,深度暂时定死为4    private static void  print2(int[] numbers){    int t=1;    int begin=0;    int gap=0;    for (int i = 0; i < numbers.length; i++) {       switch (i) {case 0:gap=7;break;case 1:gap=3;break;case 2:gap=7;break;case 3:gap=1;break;case 4:case 5:case 6:gap=3;break;case 7:gap=0;break;default:gap=1;break;}    if(gap>0){            System.out.printf("%"+gap+"s"," ");    }        System.out.print(numbers[i]);        begin++;        if(begin==t){//换行        System.out.println();        t=t*2;        begin=0;        }        }        System.out.println();    }    }


0 0
原创粉丝点击