排序

1.排序的基本定义

排序:就是使一串记录,按照其中的某个或者某些关键字的大小,递增或递减的排列起来的操作。
排序算法:就是如何使得记录按照要求排列的方法。排序算法在很多领域都得到很大的重视,尤其在大量数据的处理方面。一个优秀的算法可以节省大量的资源。

稳定:A=B,排序前A在B前,排序后A仍在B前
不稳定:A=B,排序前A在B前,排序后B在A前
2.排序的分类

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序
  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
    3.排序的时间复杂度和空间复杂度

    4.比较执行效率
    (1)各种情况下的时间复杂度
    (2)时间复杂度的系数常数等
    (3)比较次数或移动次数

十大排序算法

本博客基于以下优秀博客合写,并加入自己的一些手写图例
【参考阅读:十大经典排序算法;十大经典排序算法(含优化);十大经典排序算法动画与解析,看我就够了!(配代码完全版)

1. 冒泡排序(Bubble Sort)

1.1 定义

冒泡排序(Bubble Sort):是一种典型的交换排序算法,通过交换数据元素的位置进行排序。
关键的两步操作:比较和交换

1.2 基本思想
从无序数组的头部开始,两两比较,根据大小交换位置,直到最大(最小)的数移到该数组尾部,循环前面的操作,完成排序。
1.3 描述
(1)比较相邻的元素,如果第一个比第二个大,就交换它们的位置;
(2)对每一对相邻元素作同样的工作,从开始第一对进行到结尾的最后一对,这样在最后的元素将是最大的数;
(3)针对所有位置的元素重复以上的步骤,除了最后一个;
(4)持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对相邻的数组需要比较,则序列最终有序。
1.4 动图示例

以实际代码为例:(标志变量版)

1.5 代码实现

package ten_sort;public class Bubble_sort {// 比较和交换// 普通版冒泡排序public static int[] bubbleSort(int[] arr) {//      i控制排序次数,j控制比较次数int i, j, temp, len = arr.length;//最后一个元素自动有序for (i = 0; i < len - 1; i++) {for (j = 0; j < len - i - 1; j++) {//此处为比较和交换if (arr[j] < arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;}public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = { 3, 5, 32, 2, 12, 2, 11 };int[] bubbleArray = bubbleSort(arr);for (int i = 0; i < bubbleArray.length; i++) {System.out.print(bubbleArray[i] + " ! ");}}}

1.6 改进一(加上标志变量)

在外层循环里面加入一个标志变量flag,如果在一次冒泡过程中发现没有发送数据交换,则认为当前数组已经有序,则改变flag变量的值,循环终止。
减少了循环次数!

实现代码如下:

package ten_sort;public class Bubble_sort_up1 {//  自动生成返回值对象的快捷键 ctrl+1+enter
//  放大缩小ctrl + -public static int[] bubbleSort(int[] arr) {int i, j, temp, len = arr.length, flag = 1, count = 0;for (i = 0; i < len - 1 && flag != 0; i++) {count++;flag = 0;for (j = 0; j < len - i - 1; j++) {if (arr[j] < arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = 1;}}}System.err.println(count);return arr;}public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = { 3, 5, 32, 2, 12, 2, 11 };int[] bubbleArray = bubbleSort(arr);for (int i = 0; i < bubbleArray.length; i++) {System.out.println(bubbleArray[i] + " ! ");}}
}

1.7 改进二(来回排序)

在每趟排序过程中进行正向和反向两次冒泡的方法,这样一次排序可以得到两个最终值(最大值和最小值),从而使排序趟数几乎减少了一半。
实际上,如果数组在乱序的状态下,鸡尾酒排序和传统的冒泡排序效率都很差劲

package ten_sort;public class Bubble_sort_up2 {//  来回排序/鸡尾酒排序public static void rebackSort(int arr[]) {int i, temp, left = 0, right = arr.length - 1;while (left < right) {//          正向冒泡,左至右,找最大for (i = left; i < right; i++) {if (arr[i] > arr[i + 1]) {temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}
//          向左移动一位right--;
//          反向冒泡,从右往左,找最小for (i = right; i > left; i--) {if (arr[i - 1] > arr[i]) {temp = arr[i];arr[i] = arr[i - 1];arr[i - 1] = temp;}}
//          向右移一位left++;}for (int k = 0; k < arr.length; k++) {System.out.println(arr[k] + " ! ");}}public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = { 3, 5, 32, 2, 12, 2, 11 };rebackSort(arr);}
}

1.8 性能分析

简而言之:时间O(n²),空间O(1)&#x

数据结构与算法——十大排序相关推荐

  1. 排序算法——十大排序算法的图示与实现

    十大排序算法概览 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于 ...

  2. 排序算法——十大排序算法总结与对比

    一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...

  3. 算法 十大排序 堆排序

    十种排序算法--堆排序(小顶堆) 首先要了解什么是堆?小顶堆又是什么?而堆排序是十种排序种唯一种自定义的数据结构 这里的堆就是我们所熟悉的二叉树 而小顶堆又是什么呢? 小顶堆就是根节点比子节点小,子节 ...

  4. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

    码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...

  5. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  6. 数据结构与算法:十大排序算法之插入排序

    数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...

  7. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  8. 数据结构与算法:十大排序算法之冒泡排序

    数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...

  9. 【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章

    原地址:https://mp.weixin.qq.com/s?__biz=MzIwNTc4NTEwOQ==&mid=2247486981&idx=1&sn=c63cd080be ...

最新文章

  1. Android之View的绘制流程解析
  2. 选化学可否报计算机专业,选课选物化生报什么专业前景好
  3. sql server 存储过程 SET NOCOUNT ON?
  4. win10下安装linux mint,win10系统安装Mint Linux 18的详细步骤
  5. python学习笔记系列-方便自我学习
  6. Android之Activity的4种加载模式
  7. recover 没有捕获异常_defer + recover 捕获所有异常
  8. Confluence 6 修改警告的阈值和表现
  9. SAP License:SAP菜单修改
  10. Redis常用命令、数据类型讲解
  11. AD7327 AD芯片使用记录
  12. 把14亿中国人都拉到一个微信群在技术上能实现吗?
  13. linux socket监听端口,Linux-socket使用
  14. 讯飞输入法pad版x86_讯飞输入法Pad版下载
  15. 微信的Linux版本,ubuntu16.04安装微信,linux原生版
  16. 静态网页制作小技巧(logo及字体图标)
  17. 成功解决FAT32 No GRLDR问题
  18. 阿里云国际站代充值个人注册与分销商邀约区别
  19. FSA确定性识别算法
  20. 小象学院 零基础Python入门 案例四 52周存钱挑战v_3.0

热门文章

  1. 弹性网惩罚项的可视化分析(R语言)
  2. 算法竞赛进阶指南 0X40数据结构进阶——楼兰图腾
  3. FlashFXP 3.6 Final(正式版)注册码
  4. php采集从零,PHP从零单排(十八)图像处理
  5. 使用QtCreator开发ros2的环境配置
  6. Python之else用法
  7. java replace和replaceAll的区别以及用法
  8. 太保粉红守护乳腺癌复发险怎么样?好不好?
  9. 基于Matlab的非线性规划问题
  10. 软件工程团队项目视频