几种排序算法

八大经典排序算法:http://blog.csdn.net/mpk_no1/article/details/76397713 

1. 堆排序

平均性能:O(N*logN)。

定义:堆排序是利用堆积树这种结构的一种排序算法,是选择排序的一种。堆分为大根堆和小根堆。大根堆要求每个节点的值都不大于 其父节点的值,由大根堆的要求可知,最大值一定在堆顶。

思想:

1. 将初始序列(R0,R1...,Rn)构建成大顶堆

2. 将堆顶元素R[0]与最后一个元素交换,此时得到新的无序区(R0,R1,Rn-1)

3. 将无序区(R0,R1,Rn-1)构建为新的大根堆,再次将R0与最后一个元素交换,不断重复得到有序序列。

1)构建初始堆

一组记录(5,11,7,2,3,17)利用大顶堆排序方法建立初始堆为?

分析:首先建立完全二叉树。


再从最后一个非叶结点开始调整。

第一次交换7,17的位置。


11不用调整。

最后调整根结点。

此时把5换下去后,以5为根的子树不满足大顶堆的要求,因此再调整。


即最终的初始堆是:17,11,7,2,3,5.

2)得到初始堆后,堆顶元素和最后元素互换,即17和5互换,后得到不符合大根堆,重新变换,从父节点开始得到大根堆

/** 
 * @Description:堆排序算法实现 
 * @author MPK 
 * @time 2017-7-30 
 */  
public class heap_sort {  
      
    public static void heapsort(int[] list) {  
        if (list == null || list.length == 0) return ;  
          
        //建立大顶堆  
        for (int i = list.length/2-1; i >= 0; i--) {  
            heapAdjust(list, i, list.length-1);  
        }  
          
        //堆排序  
        for (int i = list.length - 1; i >= 0; i--) {  
            int temp = list[0];  
            list[0] = list[i];  
            list[i] = temp;  
            heapAdjust(list, 0, i-1);  
        }  
    }  
      
    public static void heapAdjust(int[] list, int start, int end) {  
        int temp = list[start];  
        //从start结点开始往下进行修正  
        for (int i = 2*start+1; i <= end; i = 2*i+1) {  
            //选出左右孩子较大的下标  
            if (i < end && list[i] < list[i+1]) {  
                i++;  
            }  
            if (temp >= list[i]) {  
                break;  
            }  
            list[start] = list[i];//将子节点上移  
            start = i;  
        }  
        list[start] = temp;  
    }  
  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        int[] list = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};  
        heapsort(list);  
        for (int i = 0; i < list.length; i++)   
            System.out.print(list[i] + " ");  
    }  
  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值