iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java排序算法实现的方法是什么
  • 868
分享到

Java排序算法实现的方法是什么

2023-06-02 10:06:28 868人浏览 八月长安
摘要

这篇文章主要介绍“Java排序算法实现的方法是什么”,在日常操作中,相信很多人在Java排序算法实现的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java排序算法实现的方法是什么”的疑惑有所帮助!

这篇文章主要介绍“Java排序算法实现的方法是什么”,在日常操作中,相信很多人在Java排序算法实现的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java排序算法实现的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    冒泡排序:

    (1)原理:

  • 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置。

  • 指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置。

  • 依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面。

  • 依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置。

  • 重复上述过程,没排完一轮,比较次数就减少一次。

  • (2)例子:

    待排序数据:7, 6, 9, 8, 5,1

    第一轮排序过程:

    指针先指向7,7和6比较,6<7,交换6和7的位置,结果为:6,7,9,8,5,1指针指向第二个元素7,7和9比较,9>7,不用交换位置,结果仍为:6,7,9,8,5,1指针指向第三个元素9,比较9和8,8<9,交换8和9的位置,结果为:6,7,8,9,5,1指针指向第四个元素9,比较9和5,5<9,交换5和9,结果为:6,7,8,5,9,1指针指向第五个元素9,比较9和1,1<9,交换1和9的位置,结果为6,7,8,5,1,9

    第一轮排序结束后,最大的数字9被移到了最右边。

    进行第二轮排序,过程同上,只是由于最大的9已经放在最右边了,因此不用在比较9了,少了一次比较,第二轮结束的结果为:6,7,5,1,8,9

    第三轮结果:6,5,1,7,8,9

    第四轮比较结果:5,1,6,7,8,9

    第五轮比较结果:1,5,6,7,8,9

    最终排序结果为:1,5,6,7,8,9,由上可知N个数据排序,需要进行N-1轮排序;第i轮排序需要的比较次数为N-i次。

    (3)编码思路:

    需要两层循环,第一层循环i表示排序的轮数,第二层循环j表示比较的次数。

    (4)代码实现:

    实例

    package com.test.insertsort;public class ChooseSort {    private int[] array;    private int length;        public ChooseSort(int[] array){        this.array = array;        this.length = array.length;    }            public void display(){        for(int i: array){            System.out.print(i+" ");        }        System.out.println();     }            public void chooseSort(){        for(int i=0; i<length-1; i++){            int minIndex = i;            for(int j=minIndex+1;j<length;j++){                if(array[j]<array[minIndex]){                    minIndex = j;                }            }            int temp = array[i];            array[i] = array[minIndex];            array[minIndex] = temp;         }    }        public static void main(String[] args){        int[] array={100,45,36,21,17,13,7};        ChooseSort cs = new ChooseSort(array);        System.out.println("排序前的数据为:");        cs.display();        cs.chooseSort();        System.out.println("排序后的数据为:");        cs.display();    }}

    (5)选择排序总结:

  • N个元素需要排序N-1轮;

  • 第i轮需要比较N-i次;

  • N个元素排序,需要比较n(n-1)/2次;

  • 选择排序的算法复杂度仍为O(n*n);

  • 相比于冒泡排序,选择排序的交换次数大大减少,因此速度要快于冒泡排序

  • 插入排序

    插入排序是简单排序中最快的排序算法,虽然时间复杂度仍然为O(n*n),但是却比冒泡排序和选择排序快很多。

    (1)原理:

  • 将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与其左边的元素比较,遇到比其大的元素便将元素右移,直到找到比该元素小的元素或者找到最左面发现其左侧的元素都比它大,停止;

  • 此时会出现一个空位,将该元素放入到空位中,此时该元素左侧的元素都比它小,右侧的元素都比它大;

  • 指针向后移动一位,重复上述过程。每操作一轮,左侧有序元素都增加一个,右侧无序元素都减少一个。

  • (2)例子:

    待比较数据:7, 6, 9, 8, 5,1

  • 第一轮:指针指向第二个元素6,假设6左面的元素为有序的,将6抽离出来,形成7,_,9,8,5,1,从7开始,6和7比较,发现7>6。将7右移,形成_,7,9,8,5,1,6插入到7前面的空位,结果:6,7,9,8,5,1

  • 第二轮:指针指向第三个元素9,此时其左面的元素6,7为有序的,将9抽离出来,形成6,7,_,8,5,1,从7开始,依次与9比较,发现9左侧的元素都比9小,于是无需移动,把9放到空位中,结果仍为:6,7,9,8,5,1

  • 第三轮:指针指向第四个元素8,此时其左面的元素6,7,9为有序的,将8抽离出来,形成6,7,9,_,5,1,从9开始,依次与8比较,发现8<9,将9向后移,形成6,7,_,9,5,1,8插入到空位中,结果为:6,7,8,9,5,1

  • 第四轮:指针指向第五个元素5,此时其左面的元素6,7,8,9为有序的,将5抽离出来,形成6,7,8,9,_,1,从9开始依次与5比较,发现5比其左侧所有元素都小,5左侧元素全部向右移动,形成_,6,7,8,9,1,将5放入空位,结果5,6,7,8,9,1。

  • 第五轮:同上,1被移到最左面,最后结果:1,5,6,7,8,9。

  • (3)编码分析:

    需要两层循环,第一层循环index表示上述例子中的指针,即遍历从坐标为1开始的每一个元素;第二层循环从leftindex=index-1开始,leftindex--向左遍历,将每一个元素与i处的元素比较,直到j处的元素小于i出的元素或者leftindex<0;遍历从i到j的每一个元素使其右移,最后将index处的元素放到leftindex处的空位处。

    (4)代码实现:

    实例

    package com.test.insertsort;public class InsertSort {    private int[] array;    private int length;        public InsertSort(int[] array){        this.array = array;        this.length = array.length;    }        public void display(){                for(int a: array){            System.out.print(a+" ");        }        System.out.println();    }            public void doInsertSort(){        for(int index = 1; index<length; index++){//外层向右的index,即作为比较对象的数据的index            int temp = array[index];//用作比较的数据            int leftindex = index-1;            while(leftindex>=0 && array[leftindex]>temp){//当比到最左边或者遇到比temp小的数据时,结束循环                array[leftindex+1] = array[leftindex];                leftindex--;            }            array[leftindex+1] = temp;//把temp放到空位上        }    }        public static void main(String[] args){        int[] array = {38,65,97,76,13,27,49};        InsertSort is = new InsertSort(array);        System.out.println("排序前的数据为:");        is.display();        is.doInsertSort();        System.out.println("排序后的数据为:");        is.display();    }}

    (5)插入排序分析:

    时间复杂度,由于仍然需要两层循环,插入排序的时间复杂度仍然为O(n*n)。

      比较次数:在第一轮排序中,插入排序最多比较一次;在第二轮排序中插入排序最多比较二次;以此类推,最后一轮排序时,最多比较N-1次,因此插入排序的最多比较次数为1+2+...+N-1=N*(N-1)/2。尽管如此,实际上插入排序很少会真的比较这么多次,因为一旦发现左侧有比目标元素小的元素,比较就停止了,因此,插入排序平均比较次数为N*(N-1)/4。

    移动次数:插入排序的移动次数与比较次数几乎一致,但移动的速度要比交换的速度快得多。

    综上,插入排序的速度约比冒泡排序快一倍(比较次数少一倍),比选择排序还要快一些,对于基本有序的数据,插入排序的速度会很快,是简单排序中效率最高的排序算法。

    快排、冒泡排序、选择排序、插入排序、归并排序

    一、概述:

    上文介绍了常见简单算法:冒泡排序、选择排序和插入排序。本文介绍高级排序算法:快速排序和归并排序。在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分、递归,并顺带介绍二分查找算法。

    二、划分:

    划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组。快速排序即是由划分和递归操作来完成的。

    (1)原理:

    定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没有走到中间,则交换左面大于阈值的数据和右面小于阈值的数据;重复上述过程,直到左面指针和右面指针相遇,此时左面数据均小于阈值,右面数据均大于阈值,划分结束。划分结束后,数据仍然是无序的,但更接近于有序。

    (2)例子:

    待划分数据:7, 6, 9, 8, 5,1,假设阈值为5

    第一轮:左指针指向7,右指针指向1,左指针向后移,右指针向左移,发现左面第一个大于5的元素7,右面第一个小于5的元素1,交换7和1的位置,结果:1,6,9,8,5,7;

    第二轮:从6开始找大于5的数字,找到6,右边从5起找小于5的数字,找到1,但此时由于6在1的右面,,即右指针<左指针,左右指针交叉,此时划分结束。原数列被划分为两部分,左侧子数列只有一个元素,即为1,其为小于阈值的子数列;右侧子数列包括5个元素,均为大于阈值5的元素。 (3)代码实现:

    实例

    package com.test.insertsort; public class QuickSort {            private int[] array;        private int length;        public QuickSort(int[] array){        this.array = array;        this.length = array.length;    }            public void printArray(){        for(int i=0; i<length; i++){            System.out.print(array[i]+" ");        }        System.out.println();    }                public int partition(int left, int right, int pivot){        //左指针的起点,left-1是由于在后面的循环中,每循环一次左指针都要右移,        //这样可以确保左指针从左边第一个元素开始,不然是从第二个开始        int leftpoint = left-1;        //右指针的起点,right+1是由于后面的循环中,每循环一次右指针都要左移,        //这样可以确保右指针从最右边开始,不然是从倒数第二个开始        int rightpoint = right+1;        while(true){            //找到左边大于pivot的数据,或者走到了最右边仍然没有找到比pivot大的数据            while(leftpoint<right && array[++leftpoint]<pivot);            //找到右边小于pivot的数据,或者走到了最左边仍然没有找到比pivot小的数据            while(rightpoint>left && array[--rightpoint]>pivot);            //左指针和右指针重叠或相交            if(leftpoint >= rightpoint){                break;            }else{                //交换左边大的和右边小的数据                swap(leftpoint,rightpoint);            }        }        //返回分界点,即右边子数组中最左边的点        return leftpoint;    }                public void swap(int leftpoint,int rightpoint){        int temp = array[leftpoint];        array[leftpoint] = array[rightpoint];        array[rightpoint] = temp;    }        public static void main(String args[]){        int[] array = {99,78,26,17,82,36,9,81,22,100,30,20,17,85};        QuickSort qs = new QuickSort(array);        System.out.println("划分前的数据为:");        qs.printArray();        int bound = qs.partition(0, array.length-1, 50);        System.out.println("划分后的数据为:");        qs.printArray();        System.out.println("划分的分界点为:" + array[bound] + ",分界点的坐标为:" + bound);    } }

    运行结果为:
    Java排序算法实现的方法是什么

到此,关于“Java排序算法实现的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java排序算法实现的方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Java排序算法实现的方法是什么
    这篇文章主要介绍“Java排序算法实现的方法是什么”,在日常操作中,相信很多人在Java排序算法实现的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java排序算法实现的方法是什么”的疑惑有所帮助!...
    99+
    2023-06-02
  • Java/Go/Python/JS/C基数排序算法的原理与实现方法是什么
    这篇文章主要介绍“Java/Go/Python/JS/C基数排序算法的原理与实现方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java/Go/Python/JS/C基数排序算法的原理与实现...
    99+
    2023-07-05
  • Java怎么实现排序算法Timsort
    这篇文章主要介绍“Java怎么实现排序算法Timsort”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现排序算法Timsort”文章能帮助大家解决问题。背景Timsort 是一个混合、...
    99+
    2023-07-02
  • Java排序算法之堆排序如何实现
    这篇文章主要介绍了Java排序算法之堆排序如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性︰1.父结点的键值总...
    99+
    2023-06-21
  • Go归并排序算法的实现方法
    目录归并排序的思想归并排序的 Go 代码实现归并排序的时间复杂度今天继续基础排序算法的图解和Go 代码实现,这次分享一个时间复杂度为*** 诶,时间复杂度多少先保密,文末会有分析。这...
    99+
    2024-04-02
  • java睡眠排序算法怎么实现
    本篇内容主要讲解“java睡眠排序算法怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java睡眠排序算法怎么实现”吧!先看下图:真是厉害啊,这排序, 既有多线程,又有排序,还有lambd...
    99+
    2023-06-29
  • python排序算法的简单实现方法
    1 冒泡排序  1.1 算法步骤: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元...
    99+
    2024-04-02
  • java怎么实现归并排序算法
    归并排序算法的实现步骤如下:1. 首先,实现一个归并操作函数。该函数将两个已排序的数组合并为一个新的已排序的数组。例如:```jav...
    99+
    2023-08-15
    java
  • Java的Arrays.sort()方法排序算法实例分析
      暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序。。。其实不全对。让我们分析个究竟:...
    99+
    2024-04-02
  • Java常见排序算法怎么实现
    本文小编为大家详细介绍“Java常见排序算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java常见排序算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。汇总:1. 冒泡排序每轮循环确定最值;...
    99+
    2023-06-29
  • Java十大排序算法怎么实现
    本篇内容介绍了“Java十大排序算法怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!排序算法的稳定性:  &nbs...
    99+
    2023-06-29
  • Java实现全排列的三种算法是什么
    Java实现全排列的三种算法分别是:1. 回溯法:回溯法是通过递归实现的,它通过不断交换数组中的元素位置来生成全排列。具体步骤是,从...
    99+
    2023-08-11
    Java
  • Java常用的八种排序算法是什么
    本篇内容介绍了“Java常用的八种排序算法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.直接插入排序主要解决要把新的数据插入到已经...
    99+
    2023-06-02
  • python实现快速排序的方法是什么
    快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分数据比另一部分数据小,然后再分别对...
    99+
    2023-08-18
    python
  • 图解排序算法之希尔排序Java实现
    目录一、基本思想二、代码实现三、总结一、基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整...
    99+
    2024-04-02
  • Java排序算法之怎么实现快速排序的三数取中法
    这篇文章主要讲解了“Java排序算法之怎么实现快速排序的三数取中法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java排序算法之怎么实现快速排序的三数取中法”吧!基本步骤三数取中在快排的过...
    99+
    2023-06-25
  • Java排序算法之计数排序如何实现
    这篇文章主要为大家展示了“Java排序算法之计数排序如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java排序算法之计数排序如何实现”这篇文章吧。计数排序是非比较的排序算法,用辅助数组对...
    99+
    2023-06-21
  • Java排序算法之归并排序简单实现
    算法描述:对于给定的一组记录,首先将每两个相邻的长度为1的子序列进行归并,得到 n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。package sorting;public class M...
    99+
    2023-05-30
    java算法 归并排序 ava
  • Java 归并排序算法、堆排序算法实例详解
    基本思想:  归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:合并方法:设r[i…n]由两个有序子表r[i…m...
    99+
    2023-05-31
    java 归并排序 堆排序
  • c++实现排序算法之希尔排序方式
    目录排序算法之希尔排序基本思想希尔排序算法复杂度分析关于希尔排序的问题分析排序算法之希尔排序及时间复杂度分析希尔排序时间复杂度排序算法之希尔排序 基本思想 将相距某个“增...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作