• 排序07堆排序


    一)定义

    堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。


    (1)用大根堆排序的基本思想
    ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
    ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
    ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。

    二)堆排序的实现(java)

    package com.fox;
    
    import java.util.Random;
    
    public class HeapSort {
    
    	public static void sort(int[] a) {
    		int len = a.length;
    		for (int i = 0; i < a.length - 1; i++) {
    			buildMaxHeap(a, len - 1 - i);
    			// 将堆顶元素与堆的最底层最右边的元素(即未排序部分的最后一个元素)交换。
    			swap(a, 0, len - 1 - i);
    		}
    	}
    
    	private static void swap(int[] a, int i, int j) {
    		int temp = a[i];
    		a[i] = a[j];
    		a[j] = temp;
    	}
    
    	private static void buildMaxHeap(int[] a, int lastIndex) {
    		int lf = (lastIndex - 1) / 2;// 最后一个非叶子节点的位置
    		for (int i = lf; i >= 0; i--) {
    			int k = i;
    			while (2 * k + 1 <= lastIndex) {
    				int maxIndex = 2 * k + 1;// maxIndex记录当前节点左右子节点的最大值的位置
    				if (maxIndex < lastIndex) {// 判断是否有右节点
    					if (a[maxIndex] < a[maxIndex + 1])
    						maxIndex++;
    				}
    				if (a[k] < a[maxIndex]) {
    					swap(a, k, maxIndex);
    					k = maxIndex;
    				} else {
    					break;
    				}
    			}
    		}
    	}
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		int[] a = new int[100000];
    		Random random = new Random();
    		for (int i = 0; i < a.length; i++) {
    			a[i] = random.nextInt(100000);
    		}
    		a = new int[] { 6, 7, 51, 2, 52, 8 };
    		long bt = System.currentTimeMillis();
    		HeapSort.sort(a);
    		System.out.println(System.currentTimeMillis() - bt);
    		for (int a_ : a)
    			System.out.println(a_);
    	}
    
    }
    

      

    堆排序属于选择排序,选择排序的关键是找到最值,怎么提高找到最值的效率就成为选择排序的关键。

  • 相关阅读:
    理解serverless无服务
    书单
    服务框架
    消息队列
    幂等设计
    MyBatis 3判断不为null
    Spring实现封装自定义注解@Trimmed清除字符串前后的空格
    Spring关于使用注解@Configuration去配置FormattingConversionServiceFactoryBean来实现自定义格式字符串处理无效的问题(未找到是什么原因造成的)
    Eclipse错误出现:Unable to install breakpoint in... (未能解决)
    Spring Boot中application.yml与bootstrap.yml的区别(转)
  • 原文地址:https://www.cnblogs.com/huangfox/p/2571216.html
Copyright © 2020-2023  润新知