返回顶部
首页 > 资讯 > 精选 >Java数据结构七大排序怎么使用
  • 218
分享到

Java数据结构七大排序怎么使用

2023-06-29 19:06:49 218人浏览 薄情痞子
摘要

这篇“Java数据结构七大排序怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java数据结构七大排序怎么使用”文章吧

这篇“Java数据结构七大排序怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java数据结构七大排序怎么使用”文章吧。

    一、插入排序

    1、直接插入排序

    当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]与array[i-1],array[i-2],…进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

    数据越接近有序,直接插入排序的时间消耗越少。

    时间复杂度:O(N^2)

    空间复杂度O(1),是一种稳定的算法

    直接插入排序:

    Java数据结构七大排序怎么使用

        public static void insertSort(int[] array){        for (int i = 1; i < array.length; i++) {            int tmp=array[i];            int j=i-1;            for(;j>=0;--j){                if(array[j]>tmp){                    array[j+1]=array[j];                }else{                    break;                }            }            array[j+1]=tmp;        }    }

    2、希尔排序

    希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的数分在同一组内,并对每一组内的数进行直接插入排序。然后取gap=gap/2,重复上述分组和排序的工作。当gap=1时,所有数在一组内进行直接插入排序。

    • 希尔排序是对直接插入排序的优化。 

    • 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,直接插入排序会很快。

    • 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算。

     希尔排序 :

    Java数据结构七大排序怎么使用

    public static void shellSort(int[] array){        int size=array.length;        //这里定义gap的初始值为数组长度的一半        int gap=size/2;        while(gap>0){            //间隔为gap的直接插入排序            for (int i = gap; i < size; i++) {                int tmp=array[i];                int j=i-gap;                for(;j>=0;j-=gap){                    if(array[j]>tmp){                        array[j+gap]=array[j];                    }else{                        break;                    }                }                array[j+gap]=tmp;            }            gap/=2;        }    }

    二、选择排序

    1、选择排序

    • 在元素集合array[i]--array[n-1]中选择最小的数据元素

    • 若它不是这组元素中的第一个,则将它与这组元素中的第一个元素交换

    • 在剩余的集合中,重复上述步骤,直到集合剩余1个元素

    时间复杂度:O(N^2)

    空间复杂度为O(1),不稳定

    选择排序 :

    Java数据结构七大排序怎么使用

        //交换    private static void swap(int[] array,int i,int j){        int tmp=array[i];        array[i]=array[j];        array[j]=tmp;    }    //选择排序    public static void chooseSort(int[] array){        for (int i = 0; i < array.length; i++) {            int minIndex=i;//记录最小值的下标            for (int j = i+1; j < array.length; j++) {                if (array[j]<array[minIndex]) {                    minIndex=j;                }            }            swap(array,i,minIndex);        }    }

    2、堆排序

    堆排序的两种思路(以升序为例):

    • 创建小根堆,依次取出堆顶元素放入数组中,直到堆为空

    • 创建大根堆,定义堆的尾元素位置key,每次交换堆顶元素和key位置的元素(key--),直到key到堆顶,此时将堆中元素层序遍历即为升序(如下)

    时间复杂度:O(N^2)

    空间复杂度:O(N),不稳定

    堆排序:

    Java数据结构七大排序怎么使用

        //向下调整    public static void shiftDown(int[] array,int parent,int len){        int child=parent*2+1;        while(child<len){            if(child+1<len){                if(array[child+1]>array[child]){                    child++;                }            }            if(array[child]>array[parent]){                swap(array,child,parent);                parent=child;                child=parent*2+1;            }else{                break;            }         }    }    //创建大根堆    private static void createHeap(int[] array){        for (int parent = (array.length-1-1)/2; parent >=0; parent--) {            shiftDown(array,parent,array.length);        }    }    //堆排序    public static void heapSort(int[] array){        //创建大根堆        createHeap(array);        //排序        for (int i = array.length-1; i >0; i--) {            swap(array,0,i);            shiftDown(array,0,i);        }    }

    三、交换排序

    1、冒泡排序

    两层循环,第一层循环表示要排序的趟数,第二层循环表示每趟要比较的次数;这里的冒泡排序做了优化,在每一趟比较时,我们可以定义一个计数器来记录数据交换的次数,如果没有交换,则表示数据已经有序,不需要再进行排序了。

    时间复杂度:O(N^2)

    空间复杂度为O(1),是一个稳定的排序

    冒泡排序:

    Java数据结构七大排序怎么使用

       public static void bubbleSort(int[] array){        for(int i=0;i<array.length-1;++i){            int count=0;            for (int j = 0; j < array.length-1-i; j++) {                if(array[j]>array[j+1]){                    swap(array,j,j+1);                    count++;                }            }            if(count==0){                break;            }        }    }

    2、快速排序

    任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

    时间复杂度:最好O(n*logn):每次可以尽量将待排序的序列均匀分割

                         最坏O(N^2):待排序序列本身是有序的

    空间复杂度:最好O(logn)、  最坏O(N)。不稳定的排序

    (1)挖坑法

    当数据有序时,快速排序就相当于二叉树没有左子树或右子树,此时空间复杂度会达到O(N),如果大量数据进行排序,可能会导致栈溢出。

    public static void quickSort(int[] array,int left,int right){        if(left>=right){            return;        }        int l=left;        int r=right;        int tmp=array[l];        while(l<r){            while(array[r]>=tmp&&l<r){            //等号不能省略,如果省略,当序列中存在相同的值时,程序会死循环                r--;            }            array[l]=array[r];            while(array[l]<=tmp&&l<r){                l++;            }            array[r]=array[l];        }        array[l]=tmp;        quickSort(array,0,l-1);        quickSort(array,l+1,right);    }

    (2)快速排序的优化

    三数取中法选key

    关于key值的选取,如果待排序序列是有序的,那么我们选取第一个或最后一个作为key可能导致分割的左边或右边为空,这时快速排序的空间复杂度会比较大,容易造成栈溢出。那么我们可以采用三数取中法来取消这种情况。找到序列的第一个,最后一个,以及中间的一个元素,以他们的中间值作为key值。

     //key值的优化,只在快速排序中使用,则可以为private    private int threeMid(int[] array,int left,int right){        int mid=(left+right)/2;        if(array[left]>array[right]){            if(array[mid]>array[left]){                return left;            }            return array[mid]<array[right]?right:mid;        }else{            if(array[mid]<array[left]){                return left;            }            return array[mid]>array[right]?right:mid;        }    }

    递归到小的子区间时,可以考虑用插入排序

    随着我们递归的进行,区间会变的越来越小,我们可以在区间小到一个值的时候,对其进行插入排序,这样代码的效率会提高很多。

    (3)快速排序的非递归实现

     //找到一次划分的下标    public static int patition(int[] array,int left,int right){        int tmp=array[left];        while(left<right){            while(left<right&&array[right]>=tmp){                right--;            }            array[left]=array[right];            while(left<right&&array[left]<=tmp){                left++;            }            array[right]=array[left];        }        array[left]=tmp;        return left;    }    //快速排序的非递归    public static void quickSort2(int[] array){        Stack<Integer> stack=new Stack<>();        int left=0;        int right=array.length-1;        stack.push(left);        stack.push(right);        while(!stack.isEmpty()){            int r=stack.pop();            int l=stack.pop();            int p=patition(array,l,r);            if(p-1>l){                stack.push(l);                stack.push(p-1);            }            if(p+1<r){                stack.push(p+1);                stack.push(r);            }        }    }

    四、归并排序

    归并排序(MERGE-SORT):该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    时间复杂度:O(n*logN)(无论有序还是无序)

    空间复杂度:O(N)。是稳定的排序。

    Java数据结构七大排序怎么使用

        //归并排序:递归    public static void mergeSort(int[] array,int left,int right){        if(left>=right){            return;        }        int mid=(left+right)/2;        //递归分割        mergeSort(array,left,mid);        mergeSort(array,mid+1,right);        //合并        merge(array,left,right,mid);    }    //非递归    public static void mergeSort1(int[] array){        int gap=1;        while(gap<array.length){            for (int i = 0; i < array.length; i+=2*gap) {                int left=i;                int mid=left+gap-1;                if(mid>=array.length){                    mid=array.length-1;                }                int right=left+2*gap-1;                if(right>=array.length){                    right=array.length-1;                }                merge(array,left,right,mid);            }            gap=gap*2;        }    }     //合并:合并两个有序数组    public static void merge(int[] array,int left,int right,int mid){        int[] tmp=new int[right-left+1];        int k=0;        int s1=left;        int e1=mid;        int s2=mid+1;        int e2=right;        while(s1<=e1&&s2<=e2){            if(array[s1]<=array[s2]){                tmp[k++]=array[s1++];            }else{                tmp[k++]=array[s2++];            }        }        while(s1<=e1){            tmp[k++]=array[s1++];        }        while(s2<=e2){            tmp[k++]=array[s2++];        }        for (int i = left; i <= right; i++) {            array[i]=tmp[i-left];        }    }

    五、排序算法的分析

    排序方法最好时间复杂度最坏时间复杂度空间复杂度稳定性
    直接插入排序O(n)O(n^2)O(1)稳定
    希尔排序O(n)O(n^2)O(1)不稳定
    直接排序O(n^2)O(n^2)O(1)不稳定
    堆排序O(nlog(2)n)O(nlog(2)n)O(1)不稳定
    冒泡排序O(n)O(n^2)O(1)稳定
    快速排序O(nlog(2)n)O(n^2)O(nlog(2)n)不稳定
    归并排序O(nlog(2)n)O(nlog(2)n)O(n)稳定

    以上就是关于“Java数据结构七大排序怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Java数据结构七大排序怎么使用

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

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

    猜你喜欢
    • Java数据结构七大排序怎么使用
      这篇“Java数据结构七大排序怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java数据结构七大排序怎么使用”文章吧...
      99+
      2023-06-29
    • Java数据结构七大排序使用分析
      目录一、插入排序1、直接插入排序2、希尔排序二、选择排序1、选择排序2、堆排序三、交换排序1、冒泡排序2、快速排序四、归并排序五、排序算法的分析一、插入排序 1、直接插入排序 当插入...
      99+
      2024-04-02
    • Java数据结构的十大排序
      目录1.直接插入排序1.1 动图演示1.2 插入排序的思路1.3 代码实现1.4 性能分析2.希尔排序2.1 原理2.2 动图演示2.3 代码实现2.4 性能分析3.直接选择排序3....
      99+
      2024-04-02
    • Java数据结构常见几大排序是什么
      这篇文章给大家分享的是有关Java数据结构常见几大排序是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、排序的概念和分类1.排序的基本概念排序是将一批无序的记录(数据)重新排列成按关键字有序的记录序列的过程...
      99+
      2023-06-29
    • 【数据结构--八大排序】之快速排序
      💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 ἴ...
      99+
      2023-10-26
      数据结构
    • Java数据结构常见几大排序梳理
      目录一、排序的概念和分类1.排序的基本概念2.排序的稳定性二、常见排序1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序6.1.递归快速排序6.2.非递归...
      99+
      2024-04-02
    • java数据结构之希尔排序
      希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:        插入排序...
      99+
      2023-05-30
      java 希尔排序 ava
    • Java数据结构之插入排序与希尔排序怎么实现
      这篇文章主要介绍“Java数据结构之插入排序与希尔排序怎么实现”,在日常操作中,相信很多人在Java数据结构之插入排序与希尔排序怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之插入排序...
      99+
      2023-07-05
    • Java数据结构之插入排序与希尔排序
      目录 一、正文1.排序的概念及其运用1.1排序的概念1.2排序运用1.3常见的排序算法2.插入排序算法的实现2.1插入排序二、测试代码三、结语 一、正文 1.排序...
      99+
      2023-05-14
      Java数据结构插入排序与希尔排序 数据结构插入排序 数据结构希尔排序
    • 【数据结构】选择排序 & 堆排序(二)
      目录 一,选择排序 1,基本思想 2, 基本思路 3,思路实现 二,堆排序 1,直接选择排序的特性总结: 2,思路实现 3,源代码 最后祝大家国庆快乐! 一,选择排序 1,基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个...
      99+
      2023-10-18
      排序算法 算法 数据结构 c语言 开发语言
    • Java数据结构之常见排序算法怎么实现
      这篇文章主要介绍“Java数据结构之常见排序算法怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java数据结构之常见排序算法怎么实现”文章能帮助大家解决问题。注:后续所说的复杂度 log,都...
      99+
      2023-07-04
    • java数据结构与算法(快速排序法)
      快速排序法: 顾名思议,快速排序法是实践中的一种快速的排序算法,在c++或对java基本类型的排序中特别有用。它的平均运行时间是0(N log N)。该算法之所以特别快,主要是由于非...
      99+
      2024-04-02
    • java 数据结构基本算法希尔排序
      C语言数据结构基本算法希尔排序前言:基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序, 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进...
      99+
      2023-05-31
      数据结构 希尔排序 ava
    • python数据结构的排序算法
      目录十大经典的排序算法 一、交换排序1、冒泡排序(前后比较-交换)2、快速排序(选取一个基准值,小数在左大数在右)二、插入排序1、简单插入排序(逐个插入到前面的有序数中)2、希尔排序(从大范围到小范围进行比...
      99+
      2022-06-02
      python 排序算法 python数据结构
    • python数据结构之选择排序
      选择排序(select_sort)是一个基础排序,它主要通过查找已给序列中的元素的最大或者最小元素,然后将其放在序列的起始位置或者结束位置,并通过多次这样的循环完成对已知序列的排序,在我们对n个元素进行操作时,我们至少需要n-1次。 de...
      99+
      2023-01-30
      数据结构 python
    • python数据结构之希尔排序
      def shell_sort(alist): n=len(alist) gap= int(n / 2) #步长 while gap>0: for i in range(gap,n): ...
      99+
      2023-01-30
      希尔 数据结构 python
    • Java集合和数据结构排序实例详解
      目录概念插入排序直接插入排序代码实现性能分析希尔排序代码实现性能分析选择排序直接选择排序代码实现性能分析堆排序代码实现性能分析交换排序冒泡排序代码实现性能分析快速排序代码实现性能分析...
      99+
      2024-04-02
    • Java数据结构常见排序算法有哪些
      今天小编给大家分享一下Java数据结构常见排序算法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 认识排序在学校中...
      99+
      2023-07-05
    • Java数据结构之二叉排序树的实现
      目录1 二叉排序树的概述2 二叉排序树的构建2.1 类架构2.2 查找的方法2.3 插入的方法2.4 查找最大值和最小值2.5 删除的方法3 二叉排序树的总结1 二叉排序树的概述 本...
      99+
      2024-04-02
    • 数据结构:一篇拿捏十大排序(超详细版)
      排序的概念: 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i...
      99+
      2023-10-24
      数据结构 排序算法 算法 c++ 数据分析 笔记 深度学习
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作