几种常见的Java排序算法
几种常见的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排序算法相关推荐
- c++ 弧形面如何逆时针排序_这8种常见的Java排序算法,学算法必看!
在互联网的大趋势下,数据结构和算法知识,都扮演着重要的角色. 在面试中和实际工作中也是经常遇到和使用到的. 为了让大家了解java中的算法及其代码实现,小编整理出了以下常用的 8 种: 01 直接插入 ...
- java排序算法总结_排序算法总结及Java实现
1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...
- Java十大排序算法总结,Java排序算法总结之冒泡排序
本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起 ...
- Python数据结构常见的八大排序算法(详细整理)
前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...
- java 排序算法总结,Java排序算法总结之归并排序
本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...
- Java排序算法——插入排序(Insertion Sort)
之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- 【机器学习】几种常见的无监督学习算法
几种常见的无监督学习算法 1. PCA 降维是指在保留数据特征的前提下,以少量的变量表示有许多变量的数据,这有助于降低多变量数据分析的复杂度.减少数据变量的方法有两种:一种是只选择重要的变量,不使用其 ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
最新文章
- 更换用installshield打包生成exe文件的图标
- [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
- iOS内存优化及排查方法
- CF 335B. Palindrome(DP)
- 2017-12-04HTML table布局
- hadoop元数据mysql中表字段_hive mysql元数据表说明
- 【原创】关于移动铁通某些网站打不开的问题
- 模拟登陆教务处获取成绩
- PetShop之ASP.NET缓存 --one
- [Excel]Excel函数和用法(10)——数组公式的使用方法与隔列求和
- Python反转链表
- 马云、奥巴马都上当:“女版乔布斯”600亿惊天骗局,电影都不敢这么拍
- gym102536部分简要题解
- 流媒体播放器VLC media player
- 【黄啊码】解决微信小程序showToast不显示
- 百度地图API—简易操作
- python画图代码大全-纯干货:手把手教你用Python做数据可视化(附代码)
- 关于新浪微信瘦身的问题
- OllyDbg下载与安装
- PaddleOCR数字仪表识别——3.paddleocr迁移学习
热门文章
- plc编程及应用_西门子PLC编程与工程应用
- 如何在桌面添加计算机日历工具,如何在电脑桌面上添加日历小工具?
- pdf 模版 汉字和数字_PDF怎么添加数字签名?这款编辑器软件很多人都说好用
- 迅 捷PDF编辑器去水印
- 商城项目html pc,Vue实战篇(PC端商城项目)
- PyCharm专业版 2021.3 Anaconda安装教程
- layDate时间控件
- cadnaa噪声分析测试软件,Cadna/A软件介绍
- 精益创业实战 - 第3章 制作自己的精益画布
- 金蝶K/3WISE V14.0安装包下载地址,金蝶K3 WISE V14.0安装包资源包下载链接