算法笔记-排序算法(冒泡 选择 插入)
首先罗列一下常见的十大排序算法:
一.冒泡排序
1. 定义:
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐逐渐向上冒。
2. 图是过程:
3.java代码实现:
package com.nmys.story.sort;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;/*** @Auther: Jia* @Date: 2019/8/20 22:14* @Description:冒泡排序*/
public class BubbleSort {public static void main(String[] args) {//int arr[] = {3, 9, -1, 10, 20};//bubbleSort(arr);//System.out.println("排序后");//System.out.println(Arrays.toString(arr));int[] arr = new int[80000];for (int i = 0; i <80000 ; i++) {arr[i] = (int) (Math.random()*8000000);}Date data1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date1Str = simpleDateFormat.format(data1);System.out.println("排序前的时间是=" + date1Str);//测试冒泡排序bubbleSort(arr);Date data2 = new Date();String date2Str = simpleDateFormat.format(data2);System.out.println("排序后的时间是=" + date2Str);}public static void bubbleSort(int[] arr){int temp = 0;boolean flag = false;for (int i = 0; i <arr.length-1 ; i++) {for (int j = 0; j <arr.length-1-i ; j++) {if(arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;flag = true;}}//System.out.println("第" + (i + 1) + "趟排序后的数组");// System.out.println(Arrays.toString(arr));// 在一趟排序中,一次交换都没有发生过if(!flag){break;}else {// 重置flag!!!, 进行下次判断flag = true;}}}}
4. 复杂度:
- 时间复杂度:O(n²)
- 空间复杂度:O(1),只需要一个附加程序单元用于交换
- 稳定性:不稳定 冒泡排序是不稳定的排序算法,最好情况下(初始数组本来就有序),算法执行一趟冒泡即可,做 n-1 次比较,0次交换即可,最坏情况下(初始数组完全逆序),算法需要执行 n-1 趟冒泡,比较总次数为 n * (n-1) / 2,交换总次数为 n * (n-1) / 2
5. 优化:
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)
二. 选择排序
1. 定义:
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。
2. 图解过程:
3. java代码实现:
/*** 选择排序** 1. 从待排序序列中,第一个元素假如最小和后面元素比较* 2. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;* 3. 从余下的 N - 1 个元素中,找出第二小的元素,重复①、②步,直到排序结束。* * @param arr 待排序数组*/public static void selecionSort(int[] arr){for (int i = 0; i <arr.length ; i++) {int k = i;for (int j =i+1; j <arr.length ; j++) {if(arr[k]>arr[j]){k=j;//找出最小值的下标}}// 将最小值放到未排序记录的第一个位置if(k>i){int tmp =arr[i];arr[i]=arr[k];arr[k]=tmp;}}}
4. 复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。
三. 插入排序
1. 定义:
插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分, 一部分是数组的全部元素(除去待插入的元素), 另一部分是待插入的元素; 先将第一部分排序完成, 然后再插入这个元素. 其中第一部分的排序也是通过再次拆分为两部分来进行的.
插入排序由于操作不尽相同, 可分为 直接插入排序
, 折半插入排序
(又称二分插入排序), 链表插入排序
, 希尔排序
。我们先来看下直接插入排序。
直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。
2. 图解过程:
3. 代码实现:
/*** 插入排序** 1 从第一个元素开始,该元素可以认为已经被排序* 2 取出下一个元素,在已经排序的元素序列中从后向前扫描* 3 如果该元素(已排序)大于新元素,将该元素移到下一位置* 4 重复步骤3,* 5 将新元素插入到该位置后* 6\. 重复步骤2~5* @param arr 待排序数组*/// 插入排序,a 表示数组,n 表示数组大小public static void insertionSort(int[] a,int n){if(n<=1) return;for (int i = 1; i <n ; i++) {int temp = a[i];//相当临时变量暂存int k=i-1;//相当于指针来回移动for ( ;k >=0 ; --k) {if(a[k]>temp){a[k+1]=a[k];//数据移动}else{break;}}a[k+1] =temp;//插入数据}}
4. 复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n) | O(n²) | O(1) |
Tips: 由于直接插入排序每次只移动一个元素的位, 并不会改变值相同的元素之间的排序, 因此它是一种稳定排序。
算法笔记-排序算法(冒泡 选择 插入)相关推荐
- php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...
分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21
大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...
- php冒泡 插入选择 排序,说说PHP数组的三种排序(冒泡/选择/插入)方法
说说PHP数组的三种排序(冒泡/选择/插入)方法 PHP #数组 #排序 #冒泡 #选择 #插入2012-05-30 10:17 一.冒泡排序法 说明:找到最大的数,排列到最后面,然后继续找 例: $ ...
- 经典算法——鸡尾酒排序(冒泡算法改良)
经典算法--鸡尾酒排序(冒泡算法改良) 文章分类:Java编程 搞开发的人都需要积累一些经典算法,以备不时之须. 搞开发也有好几年了,积累的一些算法一直没做过整理,这段时间无聊就把这些 ...
- 数据结构 排序【简单排序(冒泡、插入)、希尔排序、堆排序、排序方法的综合比较、2套 排序汇总代码】
目 录 第9章 排序(上) 9.1 简单排序(冒泡.插入) 1.前提 2.简单排序(冒泡排序) 3.简单排序(插入排序) 4.时间复杂度下界 9.2 希尔排序 9.3 堆排序 排序方法综合比较 排 ...
- 数据结构与算法(三) 排序算法(代码示例)
数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...
- 算法---比较排序算法
在大批量的刷题之前,做好前期的准备工作,首先明白了时间复杂度和空间复杂度的计算方法,这个在我的上一篇博文里有提到,然后对经典排序算法做一个全面了解,2017.7.13,本文大部分内容引自http:// ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
最新文章
- 在 Ubuntu 上通过命令行改变 Linux 系统语言
- html转为pdf工具,wkhtmltopdf html转pdf工具的使用
- 如何利用.pdb文件去调试
- html菜单浮动,浮动菜单,可实现上下滚动的效果
- 算法—1,简单说说最常见的冒泡排序(Bubble Sort)
- ServletContext_功能_获取文件服务器路径
- 什么是SAP Graph
- easyexcel 在 设置标题_阿里开源(EasyExcel)
- 传智168期JavaEE就业班 day05-XML 约束与解析
- radio change事件
- -XX:HandlePromotionFailure: 是否设置空间分配担保【了解】
- JavaScript 原生Ajax
- VB如何自动保存_VB编程——菜单栏设计教程
- 仓库管理员怎样做台账_要求仓管员会做手工台账,手工台账是怎样做的?
- 色彩对比广告设计_为什么我们都需要使用色彩对比检查器
- vue xlsx.js获取单元格数据类型的hooks 单元格类型处理
- 解决笔记本电脑开机速度缓慢的几种措施,亲测有效
- 你的私密照片可能正被“合法”观看
- binlog流程 mysql_MySQL binlog分析程序:Open Replicator
- 轻量化后台管理HTML设计页面