目录

QUESTION:八大排序:Java实现八大排序及算法复杂度分析

ANSWER:

一:冒泡排序

1.算法分析

2.时间复杂度分析

3.代码

二:选择排序

1.算法分析

2.时间复杂度分析

3.代码

三:插入排序

1.算法分析

2.时间复杂度分析

3.代码

四:归并排序

1.算法分析

2.时间复杂度分析

3.代码

五:堆排序

1.算法分析

2.时间复杂度分析

3.代码

六:快速排序

1.算法分析

2.时间复杂度分析

3.代码


QUESTION:八大排序:Java实现八大排序及算法复杂度分析

ANSWER:

一:冒泡排序

1.算法分析

冒泡排序是对于一个数组,从第一个数开始,与下一个数进行比较,大的冒后面,小的冒前面,相邻元素依次比较,完成一次循环,继续下一次循环,直至数组有序。

图示:

2.时间复杂度分析

由于冒泡排序是两层for循环,所以T=O(n^2)。

3.代码

*** 冒泡排序*/
public class BubbleSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}/*** 比较相邻元素大小,每次缩减一* @param arr*/public static void bubbleSort(int []arr){if (arr==null){return;}for (int i = arr.length-1; i >0 ; i--) {for (int j = 0; j <i ; j++) {if (arr[j]>arr[j+1]){swap(arr,j,j+1);}}}}
}

二:选择排序

1.算法分析

选择排序是选择数组第一个元素假设为最小元素,与后面的所以元素比较,比其它元素大就交换位置,完成一次循环就从第二个元素开始依次上述过程比较,直至数组有序。

图示:

2.时间复杂度分析n^

由于选择排序两层for循环,所以T=O(n^2)。

3.代码

/*** 选择排序*/
public class SelectionSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}/*** 假设第一个值为最小元素,每次循环与后一个元素比较找到最小元素* @param arr*/public static void selectionSort(int []arr){if (arr==null){return;}for (int i = 0; i <arr.length-1 ; i++) {int min=i;for (int j = i+1; j <arr.length ; j++) {min=arr[j]<arr[min]?j:min;}swap(arr,i,min);}}
}

三:插入排序

1.算法分析

插入排序是从数组第二个元素开始,找前面的数,比较大小,如果前面的数大,就交换位置,然后继续向前比较,。每次从第几个元素开始遍历时都把较小的元素插入到该元素前面,使其前面数组有序,完成一次循环,继续循环下一个元素直至数组有序。

图示:

2.时间复杂度分析

由于插入排序两层for循环,T=O(n^2)。

3.代码

public class InsertionSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void insertionSort(int []arr){if (arr==null){return;}for (int i = 1; i <arr.length ; i++) {for (int j = i-1; j>=0&&arr[j]>arr[j+1]; j--) {swap(arr,j,j+1);}}}
}

四:归并排序

1.算法分析

归并排序是利用二分的思想,不断的将数组进行分割为两部分,依次比较每部分的最小元素,将最小的元素放入辅助数组,直到所有元素都插入数组,完成排序。

图示:

2.时间复杂度分析

由于归并排序是合并的思想,所有T=O(n*logn)。

3.代码


public class MergeSort {/*** 将数组分段排序插入,然后归并排序* @param arr* @param l* @param m* @param r*/public static void merge(int []arr,int l,int m,int r){int []help=new int[r-l+1];int i=0;int p1=l;int p2=m+1;while (p1<=m&&p2<=r){help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];}while (p1<=m){help[i++]=arr[p1++];}while (p2<=r){help[i++]=arr[p2++];}for (int j = 0; j <help.length ; j++) {arr[j+l]=help[j];}}/*** 递归进行分段归并* @param arr* @param l* @param r*/public static void mergeSort(int []arr,int l,int r){if (l>=r){return;}int mid=((r-l)>>1)+l;mergeSort(arr,l,mid);mergeSort(arr,mid+1,r);merge(arr,l,mid,r);}/*** 数组归并排序*/public static void mergeSort(int []arr){if (arr==null){return;}mergeSort(arr,0,arr.length-1);}
}

五:堆排序

1.算法分析

堆排序的思想是根据二叉树的大根堆和小根堆的概念形成,首先依照数组建立大根堆,之后为了防止某一个元素的变化而引起整个大根堆的变化,建立一个修改二叉树为大根堆的方法,该数组保持大根堆的排序。之后交换大根堆元素,得到有序数组。

图示:

2.时间复杂度分析

堆排序建立大根堆的过程,T=O(n*logn)。

3.代码

/*** 堆排序,大根堆,小根堆*/
public class HeapSort{/*** 建立大根堆,当孩子结点大于根结点进行交换,没有进行左右孩子结点的比较* @param arr* @param index*/public static void heapInsert(int []arr,int index){while(arr[index]>arr[(index-1)/2]){swap(arr,index,(index-1)/2);index=(index-1)/2;}}/*** 修改数组为大根堆* @param arr* @param index* @param size*/public static void heapModifiy(int []arr,int index,int size){int left=2*index+1;while(left<size){//兄弟之间结点排序int largest=arr[left+1]>arr[left]&&(left+1)<size?left+1:left;//孩子结点与根结点进行比较largest=arr[index]>arr[largest]?index:largest;if (largest==index) {break;}swap(arr,index,largest);index=largest;left=2*index+1;}}/*** 堆排序* @param arr*/public static void heapSort(int []arr){if (arr==null||arr.length==0) {return;}for (int i=0;i<arr.length ;i++ ) {heapInsert(arr,i);}int size=arr.length;swap(arr,0,--size);while(size>0){heapModifiy(arr,0,size);swap(arr,0,--size);}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}
}

六:快速排序

1.算法分析

快速排序的基本思想是有荷兰国旗问题的相似,先是随机产生一个范围进行数组的划分,小于区域在左边,等于区域在中间,等于区域在右边,直至数组完成排序。

图示:

2.时间复杂度分析

快速排序T=O(n*logn)。

3.代码

/*** 快速排序*/
public class QuickSort {/***给定范围划分大于区域,等于区域,小于区域排序* @param arr* @param l* @param r* @return*/public static int[] partition(int[] arr, int l, int r) {int less = l - 1;int more = r;while (l < more) {if (arr[l] < arr[r]) {swap(arr,++less,l++);}else if (arr[l]==arr[r]){l++;}else{swap(arr,--more,l);}}swap(arr,more,r);return new int[]{less+1,more};}/*** 产生一个随机范围进行划分排序* @param arr* @param l* @param r*/public static void quickSort(int []arr,int l,int r){if (l<r){swap(arr, l+(int) (Math.random()*(r-l+1)),r);int []partition=partition(arr,l,r);quickSort(arr,l,partition[0]-1);quickSort(arr,partition[1]+1,r);}}/*** 快速排序* @param arr*/public static void quickSort(int []arr){if (arr==null){return;}quickSort(arr,0,arr.length-1);}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}
}

八大排序:Java实现八大排序及算法复杂度分析相关推荐

  1. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  2. 算法复杂度分析(下)

    前一篇文章算法复杂度分析(上)讲述了复杂度的大 O 表示法和几个分析原则,这篇文章我们来讲讲另外几种复杂度,最好情况时间复杂度(best case time complexity).最坏情况时间复杂度 ...

  3. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  4. 算法复杂度分析看这一篇就够了

    执行效率是算法一个非常重要的考量指标,而时间复杂度和空间复杂度则是衡量算法代码的执行效率. 为什么需要复杂度分析 通常情况下,我们可以在写完代码的情况下把程序跑一遍,通过统计.监控,就能得出算法执行的 ...

  5. 桶排序JAVA软件测试_111-堆排序的速度测试和小结

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  6. java 按照拼音排序,java按照文件名排序,中文按拼音字母排序

    java按照文件名排序,中文按拼音字母排序 import java.io.File; import java.text.Collator; import java.util.ArrayList; im ...

  7. 【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序

    冒泡排序 Bubble Sort的复杂度分析 什么是复杂度? 简单的来说当我们需要衡量算法的优异程度的时候就需要用到它... 对一个算法来说,我们一般用时间和空间这两个维度来衡量它.也就是算法的执行时 ...

  8. 常用排序算法复杂度分析

    1.排序大类 排序算法大致可以分为两大类:内部排序和外部排序.内部排序指的是排序数据都存储在内存中.外部排序则需要借助到外出.常用排序算法都为内部排序. 2.内部排序分类 (1)插入排序:直接插入排序 ...

  9. O(n)级选排名第k位数(附上算法复杂度分析)

    算法简述 如果想要拿到第k位,一般说复杂度都比较高.例如,用快排等方式,要用了O(nlogn)水平的时间复杂度.就算是用快排改进,每次在快排的基础上,只排剩下的一部分,在平均水平上,也会变成了O(nl ...

最新文章

  1. robotium常用方法
  2. 厉害了,我的Python,竟然可以这么玩儿......(内含福利)
  3. python 绘制折线图-怎样用python绘制折线图
  4. oracle批处理参数调用,bat调用jar包并传入多个参数
  5. Python编程 高阶函数使用技巧
  6. Flutter漫说:组件生命周期、State状态管理及局部重绘的实现(Inherit)
  7. Linux源码安装mysql 5.6.12(cmake编译)
  8. [Abp 源码分析]自动审计记录
  9. html5之api,HTML5之API(示例代码)
  10. tone mapping简介
  11. XPath 获取两个node中间的HTML Nodes
  12. Ubuntu上安装jdk出现的错误
  13. mysql 插入前查重_插入新数据是直接查重,如果有重复则不插入数据
  14. pdfjs 字体新增_JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案...
  15. 银保监会:防范以“元宇宙”名义进行的非法集资 | 产业区块链发展周报
  16. 在主动要求涨工资这事上,不要学我!从第一份工资800开始说起
  17. 小程序学习日记-微信5-蓝牙方式发现共享单车蓝牙设备
  18. 阿基米德螺旋线lisp_CAD画阿基米德螺旋线程序
  19. 编程的名言名句(幽默版)
  20. 计算机主板扩展槽,主板上这多扩展插槽,都是干什么用的,看了不后悔

热门文章

  1. 10.5 0819吉米牛逼
  2. Secure CRT 自动记录日志
  3. 深度学习-超参数调优
  4. android 控件方向旋转90度,android – 旋转视图层次90度
  5. python中sys模块有什么用_Python中模块之sys的功能介绍
  6. 四、ajax请求超时与网络异常处理
  7. LeetCode 1152. 用户网站访问行为分析
  8. LeetCode MySQL 1479. 周内每天的销售情况(dayname星期几)
  9. LeetCode 685. 冗余连接 II(并查集)
  10. 程序员面试金典 - 面试题 17.19. 消失的两个数字(数学/位运算)