zoukankan      html  css  js  c++  java
  • 排序算法Java实现(堆排序)

    算法描述:对于给定的n个记录,初始时把这些记录看作一棵顺序存储的二叉树,然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素进行交换后,堆的最后一个元素即为最大记录;接着将前(n-1)个元素重新调整为一个大顶堆,再将堆顶元素与当前堆的最后一个元素进行交换后得到次大的记录,重复该过程直到调整的堆中只剩下一个元素时为止。
    package sorting;
    
    /**
     * 堆排序
     * 平均O(nlogn),最好O(nlogn),最坏O(nlogn);空间复杂度O(1);不稳定;较复杂
     * @author zeng
     *
     */
    public class HeapSort {
    
    	public static void heapSort(int[] a) {
    		int i;
    		int len = a.length;
    		// 构建堆
    		for (i = len / 2 - 1; i >= 0; i--)
    			heapAdjust(a, i, len - 1);
    		//交换堆顶元素与最后一个元素的位置
    		for (i = len - 1; i > 0; i--) {
    			int tmp = a[0];
    			a[0] = a[i];
    			a[i] = tmp;
    			heapAdjust(a, 0, i - 1);
    		}
    	}
    
    	public static void heapAdjust(int[] a, int pos, int len) {
    		int child = 2 * pos + 1;
    		int tmp = a[pos];
    		while (child <= len) {
    			if (child < len && a[child] < a[child + 1])
    				child++;
    			if (a[child] > tmp) {
    				a[pos] = a[child];
    				pos = child;
    				child = 2 * pos + 1;
    			} else
    				break;
    		}
    		a[pos] = tmp;
    	}
    
    	public static void main(String[] args) {
    		int[] a = { 49, 38, 65, 97, 76, 13, 27, 50 };
    		heapSort(a);
    		for (int i : a)
    			System.out.print(i + " ");
    	}
    }
    

      

  • 相关阅读:
    Linux搭建maven私服
    eclipse提交项目到GitHub
    eclipse安装sts插件
    idea配置jdk
    C语言之链表————(转载)
    链表(创建,插入,删除和打印输出(转载)
    C语言之链表
    ARM 之LCD和LCD控制器
    ARM的两种启动方式 (NAND FLASH. NOR FLASH)
    ARM 汇编器对C的扩展
  • 原文地址:https://www.cnblogs.com/zengzhihua/p/4456745.html
Copyright © 2011-2022 走看看