java 基础算法教程ppt,基础排序算法(附加java实现)
七种最基本的排序算法:(面试必会!)
冒泡排序:
最基础的排序算法,从数列最前端开始,两两比较,如果前一个数比后一个数大,那么两个数就交换位置,经过一轮遍历之后,最大的数就到了数列的最后一个位置上,再进行下一次循环,第二大的数就浮到了倒数第二个位置,这样一步步较大的数往上浮的过程就是冒泡排序。
java实现:
1 public void bubbleSort(int[] arr) {2 for (int i = 0; i < arr.length; i++) {3 for (int j = 0; j < arr.length - 1; j++) {4 if(arr[j] > arr[j+1]) {5 arr[j] = arr[j]^arr[j+1]; //通过一个数异或同一个数两次,结果不变6 arr[j+1] = arr[j]^arr[j+1]; //的方法将两个数的值进行交换7 arr[j] = arr[j]^arr[j+1];8 }9 }10 }11 }
时间复杂度 O(n^2),空间复杂度O(1),稳定性(a=b,排序前a在b的前面,排序后仍在前即为稳定):稳定
选择排序:
将一个数列看成有序区和无序区,刚开始,有序区没有元素,无序区就是整个列表。将无序区的最大(或者最小)的元素找到,并与无序区的第一个元素交换位置,那么这时,无序区的第一个元素就是最大(或者最小的),此时无序区就变为第一个元素之后的剩余元素,再对剩余元素进行找最大(或者最小)元素的操作,并再把该元素与此时无序区第一个元素位置互换,依次类推,那么整个数列中最大(或者最小)的元素就依次排在了数列中
Java实现:(注意:选择排序在实现时,是记录最大值的索引,如果出现更大的值,就更新索引,最后通过索引互换元素)
1 public void selectSort(int[] arr) {2 intsubMin;3 for (int i = 0; i < arr.length - 1; i++) {4 subMin =i;5 for (int j = i + 1 ; j < arr.length; j++) {6 if(arr[j]
11 arr[i] = arr[i]^arr[subMin];12 arr[subMin] = arr[i]^arr[subMin];13 arr[i] = arr[i]^arr[subMin];14 }15 }16 }
时间复杂度 O(n^2),空间复杂度O(1),稳定性:不稳定
插入排序:
插入排序也比较直观,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
1 public void insertSort(int[] arr) {2
3 //从下标为1的元素开始选择合适的位置插入,因为下标为0只有一个元素,默认是有序的
4 for (int i = 1; i < arr.length; i++) {5
6 //tmp为要插入的元素
7 int tmp =arr[i];8
9 //j表示已排序部分的索引,它将逐渐自减
10 int j =i;11
12 //挪位置
13 while (j>0 && tmp
18 //插入
19 if(j!=i) {20 arr[j] =tmp;21 }22 }23 }
插入排序在实现上,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
时间复杂度 O(n^2),空间复杂度O(1),稳定性:稳定
希尔排序:
插入排序的改进版,确定一个间隔,然后根据这个间隔进行分组,这个间隔通常为总长度的一半,奇偶数均可。先进行组内排序,组内排序用插入排序的方法。当每组排完序以后,间隔数减半,重新进行分组并进行插入排序,知道间隔数为1,那么此时对整个数组进行插入排序。
那么为什么使用希尔排序呢?那是因为,当数列元素数目多大的时候, 插入排序的比较次数会远远大于希尔排序。
Java实现
1 publicvoid shellSort(int[] arr) {2
3 int gap = 1;4
5 while (gap
9 while(gap>0) {10 for (int i = gap; i < arr.length; i++) {11 int tmp =arr[i];12 int j = i-gap;13 while (j>=0 && arr[j]>tmp) {14 arr[j+gap] =arr[j];15 j = j-gap;16 }17 arr[j+gap] =tmp;18 }19 gap = (int) Math.floor(gap/3);20 }21 }
时间复杂度 O(n^1.3),空间复杂度O(1),稳定性:不稳定
归并排序:
核心思想为分治法,并通过递归实现。将长度为n的序列分成两个长度为n/2的子序列,对这两个子序列分别采用归并排序,最后将两个排序好的子序列合并成一个最终的排序序列。
Java代码待更新
...
时间复杂度 O(nlog以2为底n的对数),空间复杂度O(n),稳定性:稳定
快速排序:
快速排序也是分治法加递归的思想,首先从数列中挑出一个元素作为基准(pivot);重新排列数列,所有比基准小的元素放在基准前面,所有比基准大的摆在后面,(相同的数可以到仍一边)。在这个分区退出以后,该基准就处在数列的中间位置。递归地把小于基准值元素的子数列和大于基准值元素的子数列排列。
Java代码待更新
....
时间复杂度 O(nlog以2为底n的对数),空间复杂度O(nlog以2为底n的对数),稳定性:不稳定
堆排序:
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
Java代码实现待更新:
...
时间复杂度 O(nlog以2为底n的对数),空间复杂度O(1),稳定性:不稳定
java 基础算法教程ppt,基础排序算法(附加java实现)相关推荐
- 【算法基础】十大经典排序算法(动图)
算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文的重点排序方法在:冒泡排序,归并排序,快速排序,桶排序. 文末有学习资料免费 ...
- 我们一起来排序——使用Java语言优雅地实现常用排序算法
破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...
- java中常用的几种排序算法--常见笔试面试
转载:http://blog.csdn.net/ygc87/article/details/7208082 以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假 ...
- 大学计算机基础简明教程第二版答案,操作系统基础 大学计算机基础简明教程.ppt...
操作系统基础大学计算机基础简明教程ppt课件 第四章 操作系统 操作系统在计算机软件系统中的地位 操作系统分类 常用操作系统 常用操作系统 常用操作系统 4.2 Windows基础 4.2.1 Win ...
- 【Java数据结构与算法】第六章 算法的时间复杂度、算法的空间复杂度和排序算法的介绍
第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 文章目录 第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 一.算法的时间复杂度 1.时间频度 2.时间复杂度 3.常见的时间复杂 ...
- 排序算法 - 面试中的排序算法总结
排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...
- 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- 数据结构与算法:十大排序算法之插入排序
数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...
最新文章
- linux 中的who的参数,linux who命令参数及用法详解
- KaliLinux常用服务配置教程DHCP服务工作流程
- linux路由命令大全,常用Linux路由命令
- Manjaro 安装笔记
- [code] spectral cluster
- 约瑟夫环的数学优化方法
- swift调用支付宝
- 微信重大更新,电脑上也可刷朋友圈了!
- dnslog盲注原理
- axure小程序模板_公众号和小程序模板消息
- php地名转换成拼音,php汉字转拼音_php中怎么将中文转换拼音
- Tabulator PDF下载中文字体设置
- ubuntu20.04安装搜狗拼音输入法
- VOC数据集介绍及构建自己的VOC格式目标检测数据集
- OpenCV学习笔记-Shi-Tomasi角点检测
- maven出现The server encountered an internal error () that prevented it from fulfilling this request.
- android 日历翻页动画,datetimepicker一个不错的日历android特效
- 【编程题】【Scratch一级】2019.12 飞向太空
- 怎么样在家拍出好看的证件照?标准证件照拍摄技巧分享
- 数学基础--均值、方差、标准差、协方差