排序--堆排序算法

排序思路

待排数组:arr[13]={9,3,13,1,7,5,8,6,2,12,11,10,4}   

排后数组:newArr[13]=?

第一轮:定义增量值d,通常首先设定d=arr.length/3+1

    d = 13/3 + 1 = 5

           从i=5+1=6的位置开始循环,依次对比 i 和 i-5 两个位置的元素大小,当arr[i]>arr[i-5]时,位置不变;当arr[i]<arr[i-5]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

    newArr={5,3,4,17,     9,8,6,212,      11,10,13}   //相同颜色为一组子序列

第二轮:把增量值d缩小一半

    d = 5/2 + 1 = 3

           从i=3+1=4的位置开始循环,依次对比 i 和 i-3 两个位置的元素大小,当arr[i]>arr[i-3]时,位置不变;当arr[i]<arr[i-3]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

    newArr={1,3,2,   564,   8,7,9,   1211,10,   13}   //相同颜色为一组子序列

第三轮:把增量值d缩小一半

    d = 3/2 + 1 = 2

           从i=2+1=3的位置开始循环,依次对比 i 和 i-2 两个位置的元素大小,当arr[i]>arr[i-2]时,位置不变;当arr[i]<arr[i-2]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

    newArr={1,3,   2,4,   65,   8,7,   910,   11,12,   13}   //相同颜色为一组子序列

第四轮:增量值d设置为1

           d=1

    从i=1+1=2的位置开始循环,依次对比 i 和 i-1 两个位置的元素大小,当arr[i]>arr[i-1]时,位置不变;当arr[i]<arr[i-1]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置

    newArr={1,2,3,456,7,8,91011,12,13}   //相同颜色为一组子序列

           

时间复杂度

O(nlogn)

特点

1、是简单选择排序法的改进版本,优点是保存了每一次对比的状态。

2、分为大顶堆和小顶堆。

3、把待排序列构造成一个大顶堆,把大顶堆的根结点与堆数组的最后一个元素交换并移出,得到最大元素。

     剩下的堆元素再次构造成一个大顶堆,把大顶堆的根结点与堆数组的最后一个元素交换并移出,得到次大元素。

     如此重复N次,获取排序序列。

代码实现

原文地址:https://www.cnblogs.com/kavilee/p/5900157.html