iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java的堆排序、快速排序、归并排序怎么实现
  • 895
分享到

Java的堆排序、快速排序、归并排序怎么实现

2023-06-26 09:06:36 895人浏览 安东尼
摘要

本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。堆排序

本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

堆排序

  • 时间复杂度:0(N*log(N))

  • 空间复杂度:0(1)

  • 稳定性:不稳定

private static void heapSort(int[] arr) {//建堆        crearHeap(arr);        for (int i = 0; i < arr.length-1; i++) {            int heapSize=arr.length-i;            swap(arr,heapSize-1,0);            heapSize--;            shiftDown(arr,heapSize,0);        }        System.out.println(Arrays.toString(arr));    }    private static void crearHeap(int[] arr) {    // 从后往前遍历(右边非叶子节点开始), 依次进行向下调整        for (int i = (arr.length-1-1)/2; i >=0 ; i--) {            shiftDown(arr,arr.length,i);        }            }//向下调整,形成大堆    private static void shiftDown(int[] arr, int size, int i) {        int parent = i;        int child = parent*2+1;        while (child<size){            if (child +1< size && arr[child +1]> arr[child]){                child=child+1;            }            if (arr[child]>arr[parent]){                swap(arr,child,parent);            }else {                break;            }            parent=child;            child=parent*2+1;        }    }//交换    private static void swap(int[] arr, int child, int parent) {        int tmp =arr[child];        arr[child] =arr[parent];        arr[parent]=tmp;    }

快速排序

  • 时间复杂度:O(N^ logN) 最坏的时候O(N^2) 和基准值密切相关

  • 空间复杂度:0(logN) 最坏的时候O(N)

  • 稳定性:不稳定

递归

private static void quick(int[] arr) {        quickSortHelper(arr,0,arr.length-1);        System.out.println(Arrays.toString(arr));    }    private static void quickSortHelper(int[] arr, int left, int right) {        if (left>=right){            //区间只有一个元素,或者零个元素            return;        }        int index = partition(arr,left,right);        quickSortHelper(arr,left,index-1);        quickSortHelper(arr,index+1,right);    }    private static int partition(int[] arr, int left, int right) {        int i=left;        int j=right;        int baseValue=arr[right];        while (i<j){            while (i<j && arr[i]<=baseValue){                i++;            }            while (i<j && arr[j]>=baseValue){                j--;            }            if (i<j){                swap(arr,i,j);            }        }        swap(arr,i,right);        return i;    }    private static void swap(int[] arr, int i, int j) {        int tmp =arr[i];        arr[i]=arr[j];        arr[j]=tmp;    }

非递归

public static void quickSortByLoop(int[] arr) {        Stack<Integer> stack =new Stack<>();        stack.push(0);        stack.push(arr.length-1);        while (!stack.isEmpty()){            int right = stack.pop();            int left = stack.pop();            if (left>=right){                continue;            }            int index = partition(arr,left,right);            //右子树            stack.push(index+1);            stack.push(right);            //左子树            stack.push(left);            stack.push(index-1);        }        System.out.println(Arrays.toString(arr));    }    private static int partition(int[] arr, int left, int right) {        int baseValue =arr[right];        int i =left;        int j =right;        while (i<j){            while (i<j && arr[i]<=baseValue){                i++;            }            while (i<j && arr[j]>=baseValue){                j--;            }            if (i<j){                swap(arr,i,j);            }        }        swap(arr,i,right);        return i;    }    private static void swap(int[] arr, int i, int j) {        int tmp = arr[i];        arr[i] = arr[j];        arr[j] = tmp;    }

归并排序

  • 时间复杂度:O(NlogN)

  • 空间复杂度:O(N) 如果是链表,可以为O(1)

  • 稳定性:稳定

递归

public static void mergeSort(int[] arr){        mergeSortHelper(arr,0,arr.length);        System.out.println(Arrays.toString(arr));    }    private static void mergeSortHelper(int[] arr, int left, int right) {        if (right-left<=1){            return;        }        int mid = (right+left)/2;        mergeSortHelper(arr,left,mid);        mergeSortHelper(arr,mid,right);        merge(arr,left,mid,right);    }    private static void merge(int[] arr, int left, int mid, int right) {        int cur1 =left;        int cur2 =mid;        //两个数组合并后的结果        int[] output=new int[right-left];        int outputIndex=0;        while (cur1<mid && cur2<right){            if (arr[cur1]<=arr[cur2]) {                output[outputIndex++] = arr[cur1++];            }else {                output[outputIndex++] = arr[cur2++];            }        }        while (cur1<mid){            output[outputIndex++] = arr[cur1++];        }        while (cur2<right){            output[outputIndex++] = arr[cur2++];        }        for (int i = 0; i < right-left ; i++) {            arr[left+i] = output[i];        }    }

非递归

public static void mergeSortByLoop(int[] arr){        // gap 当前每个组中的元素个数.        for (int gap =1;gap<arr.length;gap*=2){            for (int i = 0; i <arr.length ; i+=2*gap) {                //相当于把两个长度为 gap 的相邻组进行了合并                int left =i;                int mid =i+gap;                int right=i+2*gap;                if (mid > arr.length){                    mid =arr.length;                }                if (right>arr.length){                    right=arr.length;                }                merge(arr,left,mid,right);            }        }        System.out.println(Arrays.toString(arr));    }

读到这里,这篇“Java的堆排序、快速排序、归并排序怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java的堆排序、快速排序、归并排序怎么实现

本文链接: https://www.lsjlt.com/news/308780.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java的堆排序、快速排序、归并排序怎么实现
    本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。堆排序...
    99+
    2023-06-26
  • golang归并排序,快速排序,堆排序的实现
    归并排序 归并排序使用经典的分治法(Divide and conquer)策略。分治法会将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得...
    99+
    2022-11-13
  • Python3实现快速排序、归并排序、堆
    # -*- coding: utf-8 -*- # @Time : 2019-03-26 16:46 # @Author : Jayce Wong # @ProjectName : leetcode # @Fi...
    99+
    2023-01-31
    快速
  • Java综合整理堆排序 快速排序 归并排序
    目录堆排序快速排序递归非递归归并排序递归非递归堆排序 时间复杂度:0(N*log(N))空间复杂度:0(1)稳定性:不稳定 private static void heapSort...
    99+
    2022-11-13
  • Java归并排序和快速排序怎么实现
    本篇内容介绍了“Java归并排序和快速排序怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!归并排序// 归并排序 ...
    99+
    2023-06-04
  • 数据结构:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序(C实现)
    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 文章目录 前言一、插入排序1.直接插入排序2.希尔排序 二、选择排序1. 选择排序2.堆排序 三、交换排序1.冒...
    99+
    2023-09-14
    数据结构 c语言 排序算法
  • Java快速排序与归并排序及基数排序图解示例
    目录一、快速排序1、基本介绍2、代码实现二、归并排序1、基本介绍2、代码实现三、基数排序1、基本介绍2、代码实现一、快速排序 1、基本介绍 以上面的数组为例分析快速排序。 首先要...
    99+
    2022-11-13
  • Java实现快速排序和堆排序的示例代码
    目录快速排序算法步骤动图演示JavaScript代码实现python代码实现Go代码实现C++代码实现Java代码实现堆排序算法步骤动图演示JavaScript代码实现Python代...
    99+
    2022-12-22
    Java快速排序 Java 堆排序 Java排序
  • C++归并法+快速排序实现链表排序的方法
    本文主要介绍了C++归并法+快速排序实现链表排序的方法,分享给大家,具体如下: 我们可以试用归并排序解决: 对链表归并排序的过程如下。 找到链表的中点,以中点为分界,将链表拆分成...
    99+
    2022-11-12
  • Java实现插入排序,希尔排序和归并排序
    目录插入排序算法步骤动图演示JavaScript代码实现Python代码实现Go代码实现Java代码实现希尔排序算法步骤JavaScript代码实现python代码实现Go代码实现J...
    99+
    2022-12-22
    Java插入排序 Java希尔排序 Java归并排序 Java排序
  • Java 归并排序算法、堆排序算法实例详解
    基本思想:  归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:合并方法:设r[i…n]由两个有序子表r[i…m...
    99+
    2023-05-31
    java 归并排序 堆排序
  • python中归并排序和快速排序有什么区别
    python中归并排序和快速排序有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在预期情况下的快速排序和归并排序时间复杂度都一样, 在空间复杂度上,没使...
    99+
    2023-06-15
  • Java排序算法之归并排序简单实现
    算法描述:对于给定的一组记录,首先将每两个相邻的长度为1的子序列进行归并,得到 n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。package sorting;public class M...
    99+
    2023-05-30
    java算法 归并排序 ava
  • Java排序算法之堆排序如何实现
    这篇文章主要介绍了Java排序算法之堆排序如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性︰1.父结点的键值总...
    99+
    2023-06-21
  • php怎么实现并归排序
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php实现归并排序算法归并排序算法的复杂度是O(nlogn)。代码如下,只需要clone下来执行composer install然后执行 php artisan te...
    99+
    2022-10-21
  • TypeScript怎么实现归并排序
    这篇文章主要介绍“TypeScript怎么实现归并排序”,在日常操作中,相信很多人在TypeScript怎么实现归并排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TypeScript怎么实现归并排序”的疑...
    99+
    2023-07-05
  • java怎么实现归并排序算法
    归并排序算法的实现步骤如下:1. 首先,实现一个归并操作函数。该函数将两个已排序的数组合并为一个新的已排序的数组。例如:```jav...
    99+
    2023-08-15
    java
  • C#实现归并排序
    什么是归并?即将两个有序的数组归并成一个更大的有序数组。 什么是归并排序?先将要排序的数组递归地分成两半分别排序,然后将结果归并起来。 归并排序能够保证将任意大小为 N 的数组排序所...
    99+
    2022-11-13
  • 归并排序python实现
      归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过程中完成了排序,合并排序算法如下: def mer...
    99+
    2023-01-31
    python
  • Java中怎么实现堆排序
    本篇文章给大家分享的是有关Java中怎么实现堆排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作