广告
返回顶部
首页 > 资讯 > 精选 >java排序算法的示例分析
  • 158
分享到

java排序算法的示例分析

2023-06-20 13:06:41 158人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关java排序算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、直接插入排序基本思想:将一个记录插入到已排序的有序表中,使插入后的表仍然有序对初始关键字{49 38

这篇文章将为大家详细讲解有关java排序算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、直接插入排序

基本思想:

将一个记录插入到已排序的有序表中,使插入后的表仍然有序

对初始关键字{49 38 65 97 76 13 27 49}进行直接插入排序

java排序算法的示例分析

package Sort;//插入排序public class InsertSort {    public static void main(String[] args) {        int [] arr={49,38,65,97,76,13,27,49};        sort(arr);       print(arr);    }    private static void sort(int [] arr) {        for (int i = 1; i < arr.length; i++) {           for(int j=i;j>0;j--){               if(arr[j]<arr[j-1]){                  swap(arr,j,j-1);               }           }        }    }    private static void swap(int [] arr,int i,int j){        int temp=0;        temp=arr[i];        arr[i]=arr[j];        arr[j]=temp;    }    private static void print(int [] arr) {        for (int i = 0; i <arr.length ; i++) {            System.out.print(arr[i]+" ");        }    }}

13 27 38 49 49 65 76 97

Process finished with exit code 0

二、 希尔排序

希尔排序又称“缩小增量排序”(Diminishing Increment Sort))属于插入排序类。

基本思想:

先将整个待排序的记录分割成若干子序列分别进行“直接插入排序”,待整个序列中的记录”基本有序“时,再对全体记录进行一次直接插入排序。

java排序算法的示例分析

package Sort;//希尔排序是插入排序的改良public class shellSort {    public static void main(String[] args) {        int [] arr={16,25,12,30,47,11,23,36,9,18,31};        sort(arr);        print(arr);    }    private static void sort(int [] arr) {        //gap设置优化        int h=1;        while(h<arr.length/3){            h=h*3+1;        }       for(int gap=h;gap>0;gap=(gap-1)/3) {//gap:希尔排序的间距           for (int i = gap; i < arr.length; i++) {               for (int j = i; j >gap-1; j-=gap) {                   if (arr[j] < arr[j - gap]) {                       swap(arr, j, j - gap);                   }               }           }       }    }    private static void swap(int [] arr,int i,int j){        int temp=0;        temp=arr[i];        arr[i]=arr[j];        arr[j]=temp;    }    private static void print(int [] arr) {        for (int i = 0; i <arr.length ; i++) {            System.out.print(arr[i]+" ");        }    }}

9 11 12 16 18 23 25 30 31 36 47

Process finished with exit code 0

三、冒泡排序

冒泡排序

四、快速排序

对冒泡排序的一种改进

基本思想:

通过一趟排序将待排序记录分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小,则可分别对这两部分记录继续分别进行排序,以达到整个序列有序。

java排序算法的示例分析

java排序算法的示例分析

package Sort;import java.util.Arrays;//快速排序public class QuickSort {    public static void main(String[] args) {        int[] arr={49,38,65,97,76,13,27,49};        sort(arr,0,arr.length-1);        System.out.println(Arrays.toString(arr));    }    private static void sort(int [] arr,int start,int end) {       if(start<end){           //把数组的第0个数作为标准数           int stared=arr[start];           //记录要排序的下标           int low=start;           int height=end;           //循环找出比标准数大和比标准数小的数           while(low<height){               //右边数字比标准数大               while(low<height&&stared<=arr[height]){                   height--;               }               //用右边的数字替换左边的数字               arr[low]=arr[height];               //左边数字比标准数小               while(low<height&&stared>=arr[low]){                   low++;               }               //用左边的数字替换右边的数字               arr[height]=arr[low];           }           arr[low]=stared;           sort(arr,start,low);           sort(arr,low+1,height);       }    }    }

[13, 27, 38, 49, 76, 97, 65, 49]

Process finished with exit code 0

五、选择排序(Selection Sort)

选择排序

六、堆排序

  堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。

每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

1、大顶堆举例说明:

java排序算法的示例分析

我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子:

java排序算法的示例分析

大顶堆特点:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] // i 对应第几个节点,i从0开始编号

2、小顶堆举例说明

java排序算法的示例分析

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] // i 对应第几个节点,i从0开始编号

一般升序采用大顶堆,降序采用小顶堆

堆排序基本思想

一、堆排序的基本思想是:

将待排序序列构造成一个大顶堆

此时,整个序列的最大值就是堆顶的根节点。

将其与末尾元素进行交换,此时末尾就为最大值。

然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

二、代码示例

package Sort;import java.util.Arrays;public class HeapSort {    public static void main(String[] args) {        int [] arr={4,6,8,5,9};        heapSort(arr);    }    //编写一个堆排序的方法    public static void heapSort(int[] arr){        int temp=0;        for(int i=arr.length/2-1;i>=0;i--){            adjustHeap(arr,i,arr.length);        }        //将堆顶元素与末尾元素进行交换,此时末尾就为最大值,将最大值全放在数组最后        //重新调整结构,使其满足堆定义,继续交换堆顶元素与当前末尾元素,反复执行调整交换步骤,使整个序列达到有序        for(int j=arr.length-1;j>0;j--) {            //交换            temp = arr[j];            arr[j] = arr[0];            arr[0] = temp;            adjustHeap(arr, 0, j);        }        System.out.println("数组"+Arrays.toString(arr));    }    //将数组调整为一个大顶堆        public static void adjustHeap(int[]arr,int i,int length){         int temp=arr[i];//先取出当前元素的值,保存在临时变量中        //开始调整        //k=i*2+1;k是i节点的左子节点        for(int k=i*2+1;k<length;k=k*2+1){              if(k+1<length&&arr[k]<arr[k+1]){//说明左子节点的值小于右子节点的值                 k++;//k指向右子节点              }              if(arr[k]>temp){//如果子节点大于父节点                  arr[i]=arr[k];//把较大的值赋给当前节点                  i=k;//!!!i指向k,继续循环比较              }else{                  break;              }        }        //当for循环结束后,已经将以i为父结点的最大值放在了堆顶上(局部)          arr[i]=temp;//将temp的值放在调整后的位置    }}

堆排序结果:

数组[4, 5, 6, 8, 9]

七、归并排序

定义:

又一类不同的排序方法,将两个或两个以上的有序表合并成一个新的有序表。

需要辅助空间:O(n)

整个归并需要 [log2n]

时间复杂度:O(nlog2n)

缺点:归并排序占用附加存储较多, 需要另外一个与原待排序对象数组同样大小的辅助数组。

优点:归并排序是一个稳定的排序方法

思路可以推广到“多路归并”

常用于外部排序

java排序算法的示例分析

java排序算法的示例分析

package Sort;//归并排序public class MergeSort {    public static void main(String[] args) {        int [] arr={4,5,7,8,1,2,3,6};        sort(arr);        print(arr);    }    private static void sort(int [] arr) {        int mid=arr.length/2;        int[]temp=new int[arr.length];        int i=0;//标记左边数组        int j=mid+1;//标记右边数组起始点        int k=0;        while(i<=mid&&j<arr.length){            if(arr[i]<=arr[j]){               temp[k]=arr[i];               i++;               k++;            }else{                temp[k]=arr[j];                j++;                k++;            }        }        while(i<=mid){temp[k++]=arr[i++];}//将左边剩余的,复制到数组        while(j<arr.length){temp[k++]=arr[j++];}//将右边剩余的,复制到数组    }    private static void print(int [] arr) {        for (int i = 0; i <arr.length ; i++) {            System.out.print(arr[i]+" ");        }    }}

1 2 3 4 5 6 7 8

Process finished with exit code 0

关于“java排序算法的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: java排序算法的示例分析

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

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

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

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

下载Word文档
猜你喜欢
  • java排序算法的示例分析
    这篇文章将为大家详细讲解有关java排序算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、直接插入排序基本思想:将一个记录插入到已排序的有序表中,使插入后的表仍然有序对初始关键字{49 38...
    99+
    2023-06-20
  • javascript中排序算法的示例分析
    小编给大家分享一下javascript中排序算法的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!冒泡排序冒泡排序需要两个嵌套的循环. 其中, 外层循环移动游标; 内层循环遍历游标及...
    99+
    2022-10-19
  • Java的Arrays.sort()方法排序算法实例分析
      暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序。。。其实不全对。让我们分析个究竟:...
    99+
    2022-11-13
  • Java中插入排序算法之希尔排序+直接插入排序的示例分析
    这篇文章给大家分享的是有关Java中插入排序算法之希尔排序+直接插入排序的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。希尔排序在介绍希尔排序之前,先了解一下直接插入排序一、直接插入排序1. 单趟排序x插...
    99+
    2023-06-25
  • JS中常见排序Sort算法的示例分析
    小编给大家分享一下JS中常见排序Sort算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!排序算法(Sort)引言我们...
    99+
    2022-10-19
  • 分析Java排序算法之希尔排序
    这篇文章主要介绍“分析Java排序算法之希尔排序”,在日常操作中,相信很多人在分析Java排序算法之希尔排序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析Java排序算法之希尔排序”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • Angular排序的示例分析
    这篇文章主要为大家展示了“Angular排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular排序的示例分析”这篇文章吧。angular的排...
    99+
    2022-10-19
  • HashTable排序的示例分析
    小编给大家分享一下HashTable排序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近在做项目过程中,解析XML文档存放到了hashtable中,但...
    99+
    2023-06-03
  • Java基于分治法实现的快速排序算法示例
    本文实例讲述了Java基于分治法实现的快速排序算法。分享给大家供大家参考,具体如下:package cn.nwsuaf.quick;public class Quick { public static void swap(int[] ...
    99+
    2023-05-30
    java 分治法 快速排序
  • Python快速排序算法实例分析
    本文实例讲述了Python快速排序算法。分享给大家供大家参考,具体如下: 快速排序的时间复杂度是O(NlogN) 算法描述: ① 先从序列中取出一个数作为基准数 ② 分区过程, 将比这个数大的数全部放到它的...
    99+
    2022-06-04
    算法 实例 快速
  • c语言排序算法案例分析
    本文小编为大家详细介绍“c语言排序算法案例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言排序算法案例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在归并算法中,合并两个数列需要消耗m+n的空间,排...
    99+
    2023-06-17
  • C语言排序算法实例分析
    这篇文章主要讲解了“C语言排序算法实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言排序算法实例分析”吧!1、直接插入排序基本思想:当插入第i(i>=1)个元素时,前面的ar...
    99+
    2023-06-29
  • java睡眠排序算法示例实现
    无聊逛论坛,发现了这张图 真是厉害啊,这排序, 既有多线程,又有排序,还有lambda表达式,但是这是C#版本,作为一个入坑的Java爱好者,当然要去试试Java版本了,废话不多说...
    99+
    2022-11-13
  • Java算法之堆排序代码示例
    堆是一种特殊的完全二叉树,其特点是所有父节点都比子节点要小,或者所有父节点都比字节点要大。前一种称为最小堆,后一种称为最大堆。比如下面这两个: 那么这个特性有什么作用?既然题目是堆排序,那么肯定能用来排序。想要用堆排序首先要创建一...
    99+
    2023-05-30
    java 算法实例 ava
  • Java数组实现堆排序的示例分析
    这篇文章主要为大家展示了“Java数组实现堆排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java数组实现堆排序的示例分析”这篇文章吧。数组全部入堆,再出堆从后向前插入回数组中,数...
    99+
    2023-05-30
    java
  • Java经典排序算法源码分析
    本篇内容主要讲解“Java经典排序算法源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java经典排序算法源码分析”吧!1.1 快速排序快速排序,一种排序很快的方法,使用分治思想,就是说快...
    99+
    2023-07-05
  • Python实现冒泡排序算法的示例解析
    目录1. 算法描述2. 算法分析3. 动图展示4. 代码实现5. 算法升级6. 时间复杂度分析1. 算法描述 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排...
    99+
    2022-11-11
  • 排序算法图解之Java快速排序的分步刨析
    目录1.快速排序简介2.思路简介及图解3.实现代码及运行结果1.快速排序简介 快速排序是对冒泡排序的一种改进。基本思想为:通过一趟排序将要排序的数据分割为独立的两个部分,其中一部分的...
    99+
    2022-11-13
    Java快速排序算法 Java快速排序 Java 排序
  • web中桶排序的示例分析
    这篇文章主要为大家展示了“web中桶排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中桶排序的示例分析”这篇文章吧。桶排序是将待排序集合中处于同一个值域的元素存入同一个桶中,也...
    99+
    2023-06-27
  • web中堆排序的示例分析
    这篇文章给大家分享的是有关web中堆排序的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种**选择排序,**它的最坏,最好,平均时间复杂度均为O(...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作