堆排序java实现

堆的定义:
        n个关键字序列K1,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2)或(ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2)),称为小根堆(或大根堆)。k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点。
        若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
        大根堆和小根堆:根结点(堆顶)的关键字是堆里所有结点关键字中最小者(或最大者)的堆称为小根堆(或大根堆)。注意:①堆中任一子树亦是堆。

堆排序:
        堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(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 代码实现建堆和堆排序如下:

public class HeapSort {

    /*建队算法*/
    public void Filterheap(int heap[],int root,int upper){
        /*heap为待筛选的堆,root为堆的根结点,upper为无序区的上界*/
        int child; //指向孩子结点
        int item;   //作为过渡变量
        int r=root;    //r指向根结点
        child=2*root+1;  //初始时为根结点的左孩子
        while(child<upper){
            /*比较左右孩子的关键字值,并取大者*/
            if(child+1<upper && heap[child+1]>heap[child]){
                child=child+1;
            }
            /*若根结点不满足堆的条件,则与孩子交换*/
            if(heap[r]<heap[child]){
                item=heap[r];
                heap[r]=heap[child];
                heap[child]=item;
                r=child;
                child=2*child+1;                
            }else break;   //若根满足堆的条件,则不交换,并退出筛选
        }

    }

    public void heapSort(int heap[],int n){
        /*heap为待排序序列,n为序列长度*/
        int i;
        int item;//过渡变量
        for(i=(n-1)/2;i>0;i--){  //从第一个非页结点开始创建初始堆
            Filterheap(heap,i,n);
        }

        for(i=n-1;i>0;i--){  //做n-1趟排序,每次堆的大小减1
            /*将堆顶元素与当前大根堆的最后一个元素交换*/
            item=heap[0];
            heap[0]=heap[i];
            heap[i]=item;

            /*筛选,将0~i的元素重新调整*/
            Filterheap(heap,0,i); 

            /*显示排序过程*/
            for(int j=0;j<n;j++){
                System.out.print(heap[j]+", ");
            }
            System.out.println();
        }

    }

    public static void main(String[] args) {
        /*使用堆排序法进行排序*/
        int heap[]=new int[]{9,8,7,6,5,4,3,2,1};  //把待排序的数存放在数组中
        int n=heap.length;
        HeapSort hs=new HeapSort();
        hs.heapSort(heap,n);
    }

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java排序实现步骤如下: 1. 将待排序数组构建成一个大根堆(或小根堆)。 2. 将堆顶元素与堆底元素交换位置,并将堆底元素移出堆。 3. 对新的堆顶元素进行堆调整,使其满足堆的性质。 4. 重复步骤2和3,直到堆中只剩下一个元素。 Java代码实现如下: ```java public class HeapSort { public static void heapSort(int[] arr) { if (arr == null || arr.length < 2) { return; } // 构建大根堆 for (int i = arr.length / 2 - 1; i >= 0; i--) { heapify(arr, i, arr.length); } // 将堆顶元素与堆底元素交换位置,并将堆底元素移出堆。对新的堆顶元素进行堆调整,使其满足堆的性质。 for (int i = arr.length - 1; i > 0; i--) { swap(arr, 0, i); heapify(arr, 0, i); } } private static void heapify(int[] arr, int index, int size) { int left = index * 2 + 1; int right = index * 2 + 2; int largest = index; if (left < size && arr[left] > arr[largest]) { largest = left; } if (right < size && arr[right] > arr[largest]) { largest = right; } if (largest != index) { swap(arr, index, largest); heapify(arr, largest, size); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` 在该代码中,heapify方法用于将一个节点调整为符合堆性质的节点,swap方法用于交换两个元素的位置。在heapSort方法中,首先构建一个大根堆,然后依次将堆顶元素与堆底元素交换位置,并对新的堆顶元素进行堆调整,直到堆中只剩下一个元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值