选择排序(Selection sort)、插入排序(Insertion sort)与气泡排序(Bubble sort)这三个排序方式是初学排序所必须知道的三个基本排序方式,它们由于速度不快而不实用(平均与最快的时间复杂度都是O(n^2)),但是它们排序的方式仍然值得我们学习与探讨。

2.1 选择排序

将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个。

排序前:70 80 31 37 10 1 48 60 33 80

  • [1] 80 31 37 10 70 48 60 33 80 选出最小值1
  • [1 10] 31 37 80 70 48 60 33 80 选出最小值10
  • [1 10 31] 37 80 70 48 60 33 80 选出最小值31
  • [1 10 31 33] 80 70 48 60 37 80 …
  • [1 10 31 33 37] 70 48 60 80 80 …
  • [1 10 31 33 37 48] 70 60 80 80 …
  • [1 10 31 33 37 48 60] 70 80 80 …
  • [1 10 31 33 37 48 60 70] 80 80 …
  • [1 10 31 33 37 48 60 70 80] 80 …
 public static void selectionSort(int[] number) {for (int i = 0; i < number.length - 1; i++) {int m = i;for (int j = i + 1; j < number.length; j++) {if (number[j] < number[m]) {m = j;}}if (i != m) {swap(number, i, m);}}System.out.println("选择排序结果:" + Arrays.toString(number));}

2.2 插入排序

像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置。

排序前:92 77 67 8 6 84 55 85 43 67

  • [77 92] 67 8 6 84 55 85 43 67 将77插入92前
  • [67 77 92] 8 6 84 55 85 43 67 将67插入77前
  • [8 67 77 92] 6 84 55 85 43 67 将8插入67前
  • [6 8 67 77 92] 84 55 85 43 67 将6插入8前
  • [6 8 67 77 84 92] 55 85 43 67 将84插入92前
  • [6 8 55 67 77 84 92] 85 43 67 将55插入67前
  • [6 8 55 67 77 84 85 92] 43 67 …
  • [6 8 43 55 67 77 84 85 92] 67 …
  • [6 8 43 55 67 67 77 84 85 92] …
 public static void injectionSort(int[] number) {for (int j = 1; j < number.length; j++) {int tmp = number[j];int i = j - 1;while (tmp < number[i]) {number[i + 1] = number[i];i--;if (i == -1) {break;}}number[i + 1] = tmp;}System.out.println("插入排序结果:" + Arrays.toString(number));}

2.3 冒泡排序

顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。
基本的气泡排序法可以利用旗标的方式稍微减少一些比较的时间,当寻访完阵列后都没有发生任何的交换动作,表示排序已经完成,而无需再进行之后的回圈比较与交换动作。

排序前:95 27 90 49 80 58 6 9 18 50

  • 27 90 49 80 58 6 9 18 50 [95] 95浮出
  • 27 49 80 58 6 9 18 50 [90 95] 90浮出
  • 27 49 58 6 9 18 50 [80 90 95] 80浮出
  • 27 49 6 9 18 50 [58 80 90 95] …
  • 27 6 9 18 49 [50 58 80 90 95] …
  • 6 9 18 27 [49 50 58 80 90 95] …
  • 6 9 18 [27 49 50 58 80 90 95] 由于接下来不会再发生交换动作,排序提早结束
public static void bubbleSort(int[] number) {boolean flag = true;for (int i = 0; i < number.length - 1 && flag; i++) {flag = false;for (int j = 0; j < number.length - i - 1; j++) {if (number[j + 1] < number[j]) {swap(number, j + 1, j);flag = true;}}}System.out.println("冒泡排序结果:" + Arrays.toString(number));}

2.4 代码执行

package com.gavinbj.leetcode.classic;import java.util.Arrays;public class SortUtils {public static void main(String[] args) {// TODO Auto-generated method stubint[] number = new int[10];for (int i = 0; i < 10; i++) {number[i] = (int) (Math.random() * 100);}selectionSort(number);injectionSort(number);bubbleSort(number);}/*** A:选择排序* @param number*/public static void selectionSort(int[] number) {for (int i = 0; i < number.length - 1; i++) {int m = i;for (int j = i + 1; j < number.length; j++) {if (number[j] < number[m]) {m = j;}}if (i != m) {swap(number, i, m);}}System.out.println("选择排序结果:" + Arrays.toString(number));}/*** A:插入排序* @param number*/public static void injectionSort(int[] number) {for (int j = 1; j < number.length; j++) {int tmp = number[j];int i = j - 1;while (tmp < number[i]) {number[i + 1] = number[i];i--;if (i == -1) {break;}}number[i + 1] = tmp;}System.out.println("插入排序结果:" + Arrays.toString(number));}/*** A:冒泡排序* @param number*/public static void bubbleSort(int[] number) {boolean flag = true;for (int i = 0; i < number.length - 1 && flag; i++) {flag = false;for (int j = 0; j < number.length - i - 1; j++) {if (number[j + 1] < number[j]) {swap(number, j + 1, j);flag = true;}}}System.out.println("冒泡排序结果:" + Arrays.toString(number));}private static void swap(int[] number, int i, int j) {int t;t = number[i];number[i] = number[j];number[j] = t;}}

运行结果:

选择排序结果:[16, 46, 55, 56, 67, 71, 72, 84, 96, 97]
插入排序结果:[16, 46, 55, 56, 67, 71, 72, 84, 96, 97]
冒泡排序结果:[16, 46, 55, 56, 67, 71, 72, 84, 96, 97]

【经典算法】N002:排序三剑客相关推荐

  1. 经典算法——鸡尾酒排序(冒泡算法改良)

    经典算法--鸡尾酒排序(冒泡算法改良) 文章分类:Java编程 搞开发的人都需要积累一些经典算法,以备不时之须.         搞开发也有好几年了,积累的一些算法一直没做过整理,这段时间无聊就把这些 ...

  2. 计算机大赛算法,计算机经典算法——锦标赛排序算法

    关键词:二叉树 生活中的淘汰锦标赛:在单淘汰的锦标赛中,选手们两两比赛,胜者晋级,败者被淘汰.比如世界乒乓球锦标赛或者大满贯网球赛就是这么进行的. 这样一来,就可以把比赛的赛程和结果对应成一个二叉树. ...

  3. 【经典算法学习-排序篇】直接选择排序

    一.选择排序 1.基本概念和介绍 选择排序的核心思想是:每一趟从无序区中选出关键字最小(或最大)的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止. 换句话说就是: ...

  4. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  5. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  6. 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart

    ©PaperWeekly 原创 · 作者 | yancy 单位 | 字节跳动 研究方向 | 推荐系统 背景 在许多场景中我们都需要模型学习到排序的能力,比如网页搜索场景下我们需要根据搜索词和文档的相关 ...

  7. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  8. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  9. 经典排序算法 - 鸡尾酒排序Cocktail sort

    经典排序算法 - 鸡尾酒排序Cocktail sort 鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 ...

  10. 三白话经典算法系列 Shell排序实现

    山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...

最新文章

  1. C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
  2. python开发桌面软件-python适合windows的桌面应用程序开发吗?
  3. 如何扩展Linux的ip_conntrack
  4. SpringMVC跳转页面默认类型和转发、重定向的使用
  5. Tomcat 的类加载机制
  6. minicom 串口信息过长分行显示
  7. python postgresql跨数据库操作_python 操作postgres数据库
  8. 已被骗数百万美金!App Store 中诈骗应用横行,网友:“苹果只顾抽成!”
  9. oracle byte 转string,C# 中 byte 转化成string
  10. c++中的向量_C ++中的向量
  11. 如何在Spring MVC工程中进行单元测试
  12. ajax双子星,荷兰双子星德里赫特和德容哪个厉害
  13. Python读写修改Shapefile
  14. 计算机毕业设计-JSP+Servlet网上会议室预约系统-JavaWeb会议室预约系统
  15. 网站优化基本技巧(网站优化的主要工作是什么)
  16. 怎么关闭火狐浏览器的百度辅助模式(无障碍服务)
  17. 产品 电信nb接口调用_电信物联网平台NBIoT使用Postman模拟测试接口
  18. 软件著作权转让的流程是怎么样的
  19. 图像修复实例解析(二)
  20. MATLAB入门学习笔记12

热门文章

  1. aix查看oracle进程内存使用情况,AIX 查看进程的内存使用情况
  2. JMeter压力测试时报异常:address already in use
  3. 硕士剑桥大学计算机工程系排名,剑桥大学世界排名及专业排名汇总(ARWU世界大学排名版)...
  4. 因为难看的签名尴尬?Python爬虫制作艺术签名软件
  5. 遗传算法与matlab实现 Genetic Algorithm
  6. python 网页版支付宝 api_GitHub - bluefoxah/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
  7. Hitokoto-Spider 一言库爬虫开发日记
  8. Rockland丨艾美捷Rockland小鼠γ-球蛋白介绍
  9. Linux- Top命令查看系统资源状况
  10. 人件读书笔记(37)混乱与秩序