几种常见的Java排序算法

  • 一、插入排序
  • 二、希尔排序
  • 三、冒泡排序
  • 四、选择排序
  • 五、堆排序
  • 六、快速排序
  • 七、归并排序

本文介绍了Java中几种常见的排序算法
1.插入排序(插入排序,希尔排序)
2.交换排序(冒泡排序,快速排序)
3.选择排序(选择排序,堆排序)
4.归并排序

一、插入排序

插入排序属于内部排序法,是对内部欲排序的元素以插入的方式移动到合适的位置
即把所有的元素看成两部分,一部分是有序的,另外一部分是无序的,刚开始有序的部分为一个元素,而无序的部分则为n-1个元素,排序的时候将无序序列中第一个元素和有序队列进行比较,将其放到合适的位置,形成新的有序表。

 //插入排序
public static void insertionSort(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;}}

插入排序的平均时间复杂度是O(n^2) 最好情况是O(n)最坏情况也是O(n^2),空间复杂度是O(1),稳定性 :稳定

二、希尔排序

希尔排序就是优化的插入排序,将一组数据分成n组,之后再组内进行交换即可,
给定组的值可以为固定的值,一般都为数组长度除二

 public static void shellSort(int []array){int []drr={5,2,1};for (int i = 0; i <drr.length ; i++) {shell(array,drr[i]);}}public static void shell(int []array,int gap){for(int i=gap;i<array.length;i++){int tmp=array[i];int j=i-gap;for(;j>=0;j=j-gap){if(array[j]>tmp){array[j+gap]=array[j];}else {break;}}array[j+gap]=tmp;}}

希尔排序的平均时间复杂度为O(n^1.3~1.5),最好情况是O(n),最坏情况是n平方 。空间复杂度是O(1)。
稳定性: 不稳定。

三、冒泡排序

优化冒泡排序就是插入一个boolean变量检查是否交换,如果没有交换说明已经有序即退出。

 public static void bubbleSort(int []array){for(int i=0;i<array.length-1;i++){boolean flg=false;for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){int tmp=array[j];array[j]=array[j+1];array[j+1]=tmp;flg=true;}}if(flg==false){break;}}}

冒泡排序时间复杂度为O(n^2) 最好情况是O(n)即数组就是有序的 遍历一边没有交换元素。空间复杂度为O(1)稳定性:稳定

四、选择排序

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

选择排序的时间复杂度最好最坏情况都是O(n^2) 空间复杂度为O(1), 稳定性:不稳定

五、堆排序

堆排序就是先建立一个大堆,大堆的每一个子树的根都是最大的,然后尾巴元素和根交换,之后重新建大堆,再次找到最大的数放到根位置,继续交换即可

//堆排序 从小到大排序 应该是建大堆(能知道最上面是最大的)public static void heapSort(int []array){createHeap(array);int end=array.length-1;// while(){//循环 建立大堆 每次都是头最大 交换 尾巴节点while (end>0){int tmp=array[0];array[0]=array[end];array[end]=tmp;adjust(array,0,end);end--;}}public static void adjust(int []array,int parent,int len){int child=2*parent+1;while(child<len){if(child+1<len&&array[child+1]>array[child]){child++;}if(array[child]>array[parent]){int tmp=array[parent];array[parent]=array[child];array[child]=tmp;parent=child;child=2*parent+1;}else {break;}}}public static void createHeap(int []array){for(int p=(array.length-1-1)/2;p>=0;p--){adjust(array,p,array.length);}}

堆排序的时间复杂度为O(nlogn)空间复杂度为O(1) 稳定性:不稳定

六、快速排序

快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。

public static void quickSort(int []array,int low,int high) {if(low>=high){return;}int left=low;int right=high;int base = array[low];while (left!=right) {//从后面开始检索 遇到比基准数小的就停下,遇到比基准数大于等于的就继续检索while (array[right]>=base&&left<right) {//left小于right 防止越界 比如数组内所有元素都比base小就会一路走下去right--;}while (array[left] <= base&&left<right) {left++;}int temp=array[left];array[left]=array[right];array[right]=temp;}//交换基准值和相遇位置的值array[low]=array[left];//相遇的值一定小于基准值array[left]=base;quickSort(array,low,left-1);quickSort(array,left+1,high);}

快速排序
时间复杂度最好情况是都能分割成较完美的两部分 O(nlog(n)),最坏情况是数组是有序的每次分割只有一边 O(n^2)
空间复杂度为O(nlog(n)) 稳定性:不稳定
快速排序再最坏的情况下可以优化,即优化基准值
三数取中法即low mid high 取中间大小的数字为基准值

七、归并排序

归并排序采用分而治之思想,将序列分为子序列,将子序列有序,再将两个有序的子序列合并成新的序列。

public static void mergeSort(int []array){mergeSortRec(array,0,array.length-1);}public static void mergeSortRec(int []array,int low,int high){//递归 分解if(low>=high){return;}int mid=(high+low)>>>1;mergeSortRec(array,low,mid);mergeSortRec(array,mid+1,high);merge(array,low,mid,high);//合并}public static void merge(int []array,int low,int mid,int high){//合并int[]tmparr=new int[high-low+1];int k=0;int s1=low;int s2=mid+1;while (s1<=mid&&s2<=high){if(array[s1]<array[s2]){//合并二个数组tmparr[k]=array[s1];k++;s1++;}else {tmparr[k]=array[s2];k++;s2++;}}while (s1<=mid){//如果后面的数组结束了,前面的数组还有元素就放到新数组中tmparr[k]=array[s1];k++;s1++;}while (s2<=high){tmparr[k]=array[s2];k++;s2++;}for (int i = 0; i <tmparr.length ; i++) {array[i+low]=tmparr[i]; //注意赋值时不能把原来的数组值覆盖}}

归并排序的时间平均(最好,最坏)复杂度都为O=(nlog(n)) 空间复杂度为O(n),稳定性: 稳定

几种常见的Java排序算法相关推荐

  1. c++ 弧形面如何逆时针排序_这8种常见的Java排序算法,学算法必看!

    在互联网的大趋势下,数据结构和算法知识,都扮演着重要的角色. 在面试中和实际工作中也是经常遇到和使用到的. 为了让大家了解java中的算法及其代码实现,小编整理出了以下常用的 8 种: 01 直接插入 ...

  2. java排序算法总结_排序算法总结及Java实现

    1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...

  3. Java十大排序算法总结,Java排序算法总结之冒泡排序

    本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    ...

  4. Python数据结构常见的八大排序算法(详细整理)

    前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...

  5. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  6. Java排序算法——插入排序(Insertion Sort)

    之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...

  7. Java排序算法——选择排序

    Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...

  8. 【机器学习】几种常见的无监督学习算法

    几种常见的无监督学习算法 1. PCA 降维是指在保留数据特征的前提下,以少量的变量表示有许多变量的数据,这有助于降低多变量数据分析的复杂度.减少数据变量的方法有两种:一种是只选择重要的变量,不使用其 ...

  9. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  10. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

最新文章

  1. 更换用installshield打包生成exe文件的图标
  2. [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
  3. iOS内存优化及排查方法
  4. CF 335B. Palindrome(DP)
  5. 2017-12-04HTML table布局
  6. hadoop元数据mysql中表字段_hive mysql元数据表说明
  7. 【原创】关于移动铁通某些网站打不开的问题
  8. 模拟登陆教务处获取成绩
  9. PetShop之ASP.NET缓存 --one
  10. [Excel]Excel函数和用法(10)——数组公式的使用方法与隔列求和
  11. Python反转链表
  12. 马云、奥巴马都上当:“女版乔布斯”600亿惊天骗局,电影都不敢这么拍
  13. gym102536部分简要题解
  14. 流媒体播放器VLC media player
  15. 【黄啊码】解决微信小程序showToast不显示
  16. 百度地图API—简易操作
  17. python画图代码大全-纯干货:手把手教你用Python做数据可视化(附代码)
  18. 关于新浪微信瘦身的问题
  19. OllyDbg下载与安装
  20. PaddleOCR数字仪表识别——3.paddleocr迁移学习

热门文章

  1. plc编程及应用_西门子PLC编程与工程应用
  2. 如何在桌面添加计算机日历工具,如何在电脑桌面上添加日历小工具?
  3. pdf 模版 汉字和数字_PDF怎么添加数字签名?这款编辑器软件很多人都说好用
  4. 迅 捷PDF编辑器去水印
  5. 商城项目html pc,Vue实战篇(PC端商城项目)
  6. PyCharm专业版 2021.3 Anaconda安装教程
  7. layDate时间控件
  8. cadnaa噪声分析测试软件,Cadna/A软件介绍
  9. 精益创业实战 - 第3章 制作自己的精益画布
  10. 金蝶K/3WISE V14.0安装包下载地址,金蝶K3 WISE V14.0安装包资源包下载链接