排序

所谓排序,就是指将一组数据,按照特定规则调换位置,使数据具有某种顺序关系(递增或递减)。

在排序过程中,数据的移动方式可分为直接移动和逻辑移动两种。直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据的指针。

两者之间的优劣在于直接移动会浪费许多时间进行数据的改动,而逻辑移动只要改变指针指向的位置就能达到排序的目的。数据在排序过后,往往会有以下几点好处:数据比较容易阅读

数据比较利于统计及整理

可以大幅减少数据搜索的时间。

排序分类

排序可以按照执行时所使用的内存分为以下两种方式:内部排序:排序的数据量小,可以完全在内存中进行排序。

外部排序:排序的数据量无法直接在内存中进行排序,而必须使用辅助存储器(如硬盘)。

常见的内部排序法有:冒泡排序、选择排序、插入排序、合并排序、快速排序、堆积排序、希尔排序、基数排序法等,比较常见的外部排序法有:直接合并排序、k路合并、多相合并法等。

排序算法分析

时间复杂度

当数据量比较大时,排序算法所花费的时间就很重要。排序算法的时间复杂度可以分为最好情况、最坏请求和平均情况。最好情况看是指数据已经完成排序,最坏情况是指数据顺序为要求排序的倒序(两者前提是我们未知)。

空间复杂度

空间复杂度是指算法在执行过程中所需付出的额外内存空间,例如所选择的排序法必须借助递归的方式来进行,那么递归过程中会用到的堆栈就是这个排序法所必须付出的额外空间。同时在任何排序法中都会有数据位置互换的动作,数据位置互换也会用到一个额外的空间它也是排序法中空间复杂度要考虑的问题。排所用到的额外空间越少,它的空间复杂度就越好。

算法稳定性

稳定的排序算法在经过排序后,两个相同的值应仍然保持原来的次序,即原来谁在左谁在右,排完序后也一定是谁在左谁在右,如下所示:

原始数据 :5(左),9,1,4,3,5(右),6

稳定排序 :1,3,4,5(左),5(右),6,9

不稳定排序 :1,3,4,5(右),5(左),6,9

冒泡排序

冒泡排序又称交换排序法,是有观察水中气泡的变化发现的,水中气泡随着水深度不同压力会发生改变,当气泡在水底时,水压最大气泡最小,当气泡慢慢浮上水面时,气泡由小渐渐变大。因此冒泡排序的基本原理如下:

首先从数组第一个元素开始,比较相邻元素的大小,若大小顺序不符合要求顺序,则将元素对调,对调后进行下一个元素的比较。像这样比较一轮之后就能保证最后一个元素是最大或者最小的(符合我们的要求),接着进行第二轮扫描,以此保证倒数第二个元素是符合我们要求的,如此进行下去,知道保证所有的元素满足排序关系为止。

代码如下:

JAVA

import java.util.Arrays;

public class BubbleSort {

public static void main(String[] args) {

int[] arrays = {6,5,9,7,2,8};

bubbleSort(arrays);

System.out.println(Arrays.toString(arrays));

}

public static void bubbleSort(int[] array) {

int temp;

/**

* 冒泡排序

* i 为扫描次数

* j 为比较值的坐标

*/

for (int i=array.length-1;i>0;i--) {

for (int j=0;j

if (array[j]>array[j+1]) {

temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;

}

}

}

}

}

Python

def buttle_sort(array):

for i in range(len(array)-1):

for j in range(len(array)-i-1):

if array[j] > array[j+1]:

array[j],array[j+1] = array[j+1],array[j]

if __name__ == '__main__':

array = [6,5,9,7,2,8]

buttle_sort(array)

print(array)

改良的冒泡排序

上面的冒泡排序不难看出有一个缺点,即不管数据是否已经排序完成,算法都会固定的执行n(n-1)/2次,而实际上如果数据执行中途已经完成排序,完全不必要多执行剩下的步骤,因此我们可以通过增加一个标志变量来判断数据是否已经完成排序,如果完成排序就让程序提前退出:

改良后的JAVA排序函数:

public static void bubbleSort(int[] array) {

int temp,flag;

/**

* 冒泡排序

* i 为扫描次数

* j 为比较值的坐标

*/

for (int i=array.length-1;i>0;i--) {

flag = 0;

for (int j=0;j

if (array[j]>array[j+1]) {

temp = array[j];

array[j] = array[j+1];

array[j+1] = temp;

flag++;

}

}

if (flag == 0)

break;

}

}

}

改良后的Python函数:

def buttle_sort(array):

for i in range(len(array)-1):

flag = 0

for j in range(len(array)-i-1):

if array[j] > array[j+1]:

array[j],array[j+1] = array[j+1],array[j]

flag += 1

if flag == 0:

break

选择排序

选择排序法可以使用两种方式排序,一为在所以的数据中,当由大到小排序,则将最大值放入第一位置;若由小到大排序,则将最大值放入位置末端。例如当N个数据需要由大到小排序时,首先以第一个位置的数据,依次向2、3、4...N个位置的数据作比较。

如果数据大于或等于其中一个位置,则两个位置的数据不变;若小于其中一个位置,则两个位置的数据互换。互换后,继续找下一个位置作比较,直到位置最末端,此时第一个位置的数据即为此排序数列的最大值。接下来选择第二个位置数据,依次向3、4、5...N个位置的数据作比较,将最大值放入第二个位置。依循此方法知道第N-1个位置最大值找到后,就完成选择排序法由大到小的排列。

代码如下:

JAVA

import java.util.Arrays;

public class SelectSort {

public static void main(String[] args) {

int[] arrays = {6,5,9,7,2,8};

selectSort(arrays);

System.out.println(Arrays.toString(arrays));

}

public static void selectSort(int[] array) {

int temp;

for (int i=0;i<5;i++) {

for (int j=i+1;j<6;j++) {

if (array[i]>array[j]) {

temp = array[i];

array[i] = array[j];

array[j] = temp;

}

}

}

}

}

Python

def select_sort(array):

for i in range(len(array)-1):

for j in range(i+1,len(array)):

if array[i]>array[j]:

array[i],array[j] = array[j],array[i]

if __name__ == '__main__':

array = [6, 5, 9, 7, 2, 8]

select_sort(array)

print(array)

水冒泡了几度_冒泡和选择排序详解相关推荐

  1. shell编程数组与冒泡算法排序详解

    shell编程数组与冒泡算法排序详解 一 数组的四种表达方式 二 数组的增删改查操作 三 数组传参 3.1 主程序向函数传数组参数 3.2 从函数返回数组到主程序 四 冒泡算法排序 一 数组的四种表达 ...

  2. 秒懂的shell编程数组与冒泡算法排序详解

    shell编程数组与冒泡算法排序详解 一.数组的四种表达方式 二 .数组的增删改查操作 三 .数组传参 3.1 主程序向函数传数组参数 3.2 从函数返回数组到主程序 四 .冒泡算法排序 一.数组的四 ...

  3. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  4. Python中下划线 _ 的最全用法详解

    Python中下划线 _ 的最全用法详解 '_'是什么? _在python中可以作为一个标识符,用于定义变量和方法唯一名称.同时它也是Python中的一个软关键字,指在某些特定上下文中保留的关键字.截 ...

  5. JAVA最常用的排序_冒泡排序、选择排序、快速排序

    排序算法是Java面试题中最常考的,笔试题.机试题都会有,所有掌握最常用的排序是必须. 在效率中快速排序是这几种效率最高的. 代码验证过,可以直接复制测试运行. 代码如下: package com.l ...

  6. responseentity 详解_大六壬毕法赋精注详解(1)【六壬】

    大六壬<毕法赋>精注详解(1)大六壬"毕法赋"(上) 前后引从升迁吉,首尾相见始终宜.帘幕贵人高甲第,催官使者赴官期. 六阳数足须公用,六阴相继尽昏迷.旺禄临身徒妄作, ...

  7. Java基础三个排序详解_继承粗解语法关键字分析

    集合存放数据的容器,存放的数据可以是基本类型也可以是引用类型,数据类型必须一致,存放数据的空间是连续的即地址连续,长度固定 声明数组变量 首先必须声明数组变量,才能在程序中使用数组.下面是声明数组变量 ...

  8. 算术编码例题详解_百分数与百分点区别详解

    通过以往的答疑经验,许多同学对于出现百分点的材料和题目不能够很好的百分点与已知百分数之间的关系.那么百分数与百分点的核心区别在哪里?常见题型中出现的百分数与百分点应该如何进行理解应用? 百分数与百分点 ...

  9. sgd 参数 详解_代码笔记--PC-DARTS代码详解

    DARTS是可微分网络架构搜搜索,PC-DARTS是DARTS的拓展,通过部分通道连接的方法在网络搜索过程中减少计算时间的内存占用.接下来将会结合论文和开源代码来详细介绍PC-DARTS. 1 总体框 ...

最新文章

  1. SAP RETAIL Rapid Replenishment
  2. AWR baseline template的管理
  3. uvc摄像头代码解析7
  4. Drupal8 社区文档之在Drupal中,查看网页的编辑一个页面的几乎是相同的
  5. iOS 开发之 OOA (面向对象分析) OOD (面向对象设计) OOP (面向对象编程)
  6. 企业dns 服务器的搭建
  7. C++11 统一初始化(Uniform Initialization)
  8. docker利用Dockerfile来制作镜像
  9. 基于tensorflow实现图像分类——理解神经网络运作过程、tensorflow入门
  10. 搞dedecms站 找后台的一些经验[转]
  11. matlab与comsol的连接
  12. 上海科技大学计算机夏令营随笔
  13. 好用的计算属性clac
  14. ES6中的箭头函数详细梳理
  15. varchar可以设置唯一吗_微信可以设置特效主题皮肤了,满屏幕的小爱心,你心动了吗?...
  16. 软件设计原则和编码规范
  17. 范钢:一堂如何提高代码质量的培训课
  18. IHE(Integrating the Healthcare Enterprise)
  19. python个人自动化_GAD名人堂丨方李志专访 :于Python的UI自动化测试探索者
  20. 美国50个州最值钱的Startup都是些什么公司?

热门文章

  1. 浅谈c++中结构体和共用体的区别
  2. Docker的常规应用手册
  3. C#开发命令执行驱动程序 之 控制标志的命令行参数
  4. Linux下source命令
  5. mysql高效获取两张表共同字段的交集数据
  6. 隔离存取空间IsolatedStorage【WP7学习札记之十】
  7. awk 第一个文件的数字乘以第二个文件的数字
  8. 红旗6.0SP2发布啦!
  9. javascript数组对象
  10. Educational Codeforces Round 18