首页 > 其他分享 >数据结构-堆排序

数据结构-堆排序

时间:2023-08-21 11:32:12浏览次数:44  
标签:22 int 55 堆排序 29 61 array 数据结构


java实现堆排序算法

源代码

public class HeapSort extends DataCrol {
    private void heapify(int A[], int i, int size) {  // 从A[i]向下进行堆调整
        int leftChild = 2 * i + 1;  // 左孩子索引
        int rightChild = 2 * i + 2; // 右孩子索引
        int max = i;                // 选出当前结点与其左右孩子三者之中的最大值
        if (leftChild < size && A[leftChild] > A[max])
            max = leftChild;
        if (rightChild < size && A[rightChild] > A[max])
            max = rightChild;
        if (max != i) {
            swap(A, i, max);        // 把当前结点和它的最大(直接)子节点进行交换
            heapify(A, max, size);  // 递归调用,继续从当前结点向下进行堆调整
        }
    }

    //建立大根堆过程
    // 58 55 93 61 61 29 68 00 22 07
    //             i
    // 58 55 93 61 61 29 68 00 22 07
    //          i           L  R
    // 58 55 93 61 61 29 68 00 22 07
    //       i        L  R
    // 58 55 93 61 61 29 68 00 22 07
    //    i     L  R                ->swap(i,L)
    // 58 61 93 55 61 29 68 00 22 07
    //          i           L  R
    // 58 61 93 55 61 29 68 00 22 07
    // i  L  R                      ->swap(i,R)
    // 93 61 58 55 61 29 68 00 22 07
    //       i        L  R          ->swap(i,R)
    // 93 61 68 55 61 29 58 00 22 07
    //                   i
    private void buildHeap(int A[], int size) { // 建堆,时间复杂度O(n)
        for (int i = size / 2 - 1; i >= 0; i--) // 从每一个非叶结点开始向下进行堆调整
            heapify(A, i, size);
    }


    public void heapSortOrigin(int[] array) {
        //原生实现大根堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>();
        int heapSize = array.length;
        for (int i = 0; i < heapSize; i++) maxHeap.offer(array[i]);
        while (heapSize > 0) {
            array[--heapSize] = maxHeap.poll();
        }
    }

    @Override
    public void sort(int[] array) {
        int heapSize = array.length;
        buildHeap(array, heapSize);    // 建立一个最大堆
        while (heapSize > 1) { // 堆(无序区)元素个数大于1,未完成排序
            // 将堆顶元素与堆的最后一个元素互换,并从堆中去掉最后一个元素
            // 此处交换操作很有可能把后面元素的稳定性打乱,所以堆排序是不稳定的排序算法
            swap(array, 0, --heapSize);
            heapify(array, 0, heapSize);     // 从新的堆顶元素开始向下进行堆调整,时间复杂度O(logn)

        }
//        heapSortOrigin(array);
    }

    public static void main(String[] args) {
        HeapSort heapSort = new HeapSort();
        int[] array = DataCrol.createRandomArray(10);
        DataCrol.print(array);
        heapSort.sort(array);
        DataCrol.print(array);
        heapSort.timeTest(10000000);
    }
}

log

58 55 93 61 61 29 68 0 22 7 
0 7 22 29 55 58 61 61 68 93


标签:22,int,55,堆排序,29,61,array,数据结构
From: https://blog.51cto.com/u_10101161/7173106

相关文章

  • 数据结构-希尔排序
    java实现希尔排序算法源代码publicclassShellSortextendsDataCrol{@Overridepublicvoidsort(int[]array){inth=0;intsize=array.length;while(h<=size){//生成初始增量h=3*h+1;}//......
  • 数据结构-归并排序
    java实现归并排序算法源代码publicclassMergeSortextendsDataCrol{//合并两个已排好序的数组A[left...mid]和A[mid+1...right]voidmerge(intA[],intleft,intmid,intright){intlen=right-left+1;int[]temp=newint[len];//辅......
  • 数据结构与算法八股
    讲一讲插入排序讲一讲冒泡排序讲一讲快速排序讲一讲堆排序讲一讲归并排序 dpdp数组的定义及含义:dp[num1.length+1][num2.length+1],为什么要+1呢,因为我们要判断他与前面的关系涉及到i-1,所以遍历需要从1开始return的是什么如果初始化时候size+1了,那么最后一个下标就是size......
  • 【数据结构】排序 归并排序和基数排序
    1.归并排序归并排序中的"归并"的意义就是把多个有序表合并为一个新的有序表。算法思想:二路归并排序:初始情况下将长度为n的待排序表分为n个子表,则每个子表的长度为1,是有序的。每趟排序尽量将这些子表按位置相邻两两归并,重复直到合并为一个长度为n的有序表为止。具体实现:在归......
  • 考研数据结构——每日一题[希尔排序]
    shell_sort希尔排序//每组内的下标是等差数列//c++中的sort是快排+插排【当排序到<28时改为插入排序】voidshell_sort()//希尔排序【分组的插入排序】不稳定(间隔d的分为一组){for(intd=n/3;d;d=d==2?1:d/3)//特判2,等于2就用1,(最后要用1,而2时d/3=......
  • 数据结构学习记录(一)
    堆栈与队列一、知识要点1、堆栈堆栈的定义堆栈(Stack)是一种具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶(Top)的端点位置。通常把数据插入称为压入栈(Push),删除数据称为弹出栈(Pop)。在堆栈中,最后入栈的数据被最先弹出,所以堆栈也被称为后入先出。堆栈的抽象数据......
  • COMP3506/7505 算法与数据结构
    AssignmentOne–15%AlgorithmsandDataStructures–COMP3506/7505–Semester2,2023Due:3pmonFridaySeptember1st(week6)SummaryThemainobjectiveofthisassignmentistogetyourhandsdirtywithsomesimpledatastructuresandalgorithmstosolveb......
  • C#数据结构
    C#数据结构一、数组(Array)定义元素序列,存放形同类型的变量,对象,每一项都有一个整数索引(下标);元素位于一个连续存储的内存块中;数组空间大小是固定的。数组分类一维数组,多维数组(等于或大于二维)数组的优点:随机访问性强,查找速度快,时间复杂度是0(1)数组的缺点:3.1从头部删除、从......
  • R语言的数据结构与转换
    文章和代码已经归档至【Github仓库:<https://github.com/timerring/dive-into-AI>】或者公众号【AIShareLab】回复R语言也可获取。任何数据分析的第一步都是按照所需要的格式创建数据集。在R中,这个任务包括两个步骤:首先选择一种数据结构来存储数据,然后将数据输入或者导入这个数......
  • 2022数据结构 错题
                                        5040  2的12次=4096, 2的13次=8192  当第一趟元素确认的位置为最左或最右时,第二趟排序只能确认一个位置......