你好,我是goldsunC

让我们一起进步吧!

排序

所谓排序,就是指将一组数据,按照特定规则调换位置,使数据具有某种顺序关系(递增或递减)。在排序过程中,数据的移动方式可分为直接移动逻辑移动两种。直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据的指针。两者之间的优劣在于直接移动会浪费许多时间进行数据的改动,而逻辑移动只要改变指针指向的位置就能达到排序的目的。数据在排序过后,往往会有以下几点好处:

  • 数据比较容易阅读
  • 数据比较利于统计及整理
  • 可以大幅减少数据搜索的时间。

排序分类

排序可以按照执行时所使用的内存分为以下两种方式:

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

常见的内部排序法有:冒泡排序、选择排序、插入排序、合并排序、快速排序、堆积排序、希尔排序、基数排序法等,比较常见的外部排序法有:直接合并排序、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)

 • end • 

走在路上

goldsunC

张仰彪第二排序法_十大排序之冒泡和选择排序相关推荐

  1. 张仰彪第二排序法_C语言中的最常用的两种排序算法你知道吗?

    冒泡法排序 核心思想:若有N个数从小到大排序,需进行N-1轮比较,第一轮每相邻的两个数据进行比较N-1次,最终挑选出最大的数,放到这一轮的最后位置:第二轮比较N-1-i次,挑选出这一轮最大的数,放入这 ...

  2. 9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes

    (自己手打的python实现代码以及整理的各路大神总结的知识点) 自用学习笔记,由于基于北美cs学习,文章大量中英混杂(谨慎食用) 十大排序算法: 插入排序 1)Insertion Sort 简单插入 ...

  3. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

  4. 归并排序执行次数_十大排序算法,看这篇就够了

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

  5. c语言找出最大值和最小值并按降序排输出,C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列...

    问题标题 C语言用排序法给十个数降序排列,用C语言编写,输入10个数按降序排列 2019-6-4来自ip:14.161.145.86的网友咨询 浏览量:562 手机版 问题补充: C语言用排序法给十个 ...

  6. 面试官:你都工作3年了,连选择排序法都不会,我怎么能选择你

    面试时,算法经常会遇到,特别是一些常见的算法. 张工毕业3年了,一直在一家创业公司做python开发,最近到某知名互联网公司面试,做了笔试题后,面试官看了觉得还不错,于是想进一步考察张工的编码能力,就 ...

  7. 十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

    文章目录 一.冒泡排序 1.1 冒泡排序基础[必会知识] 1.2 冒泡排序优化 1.2.1 外循环优化 1.2.2 内循环优化 1.2.3 双向遍历 1.3 冒泡排序的稳定性.复杂度和适用场景 1.3 ...

  8. C语言冒泡法和选择排序法

    C语言冒泡法和选择排序法 1.冒泡法代码 #include<stdio.h> int main() {int a[3];int p,i,tmp;for(i=0;i<3;i++)sca ...

  9. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

最新文章

  1. TIOBE12月榜单:Java重回第二,Python有望四连冠年度语言
  2. 如何让一个对话框全屏对话框
  3. Python学习入门7:python学习从基础到高手,再到就业
  4. C#统计字符出现个数
  5. 1、Python基本对象类型----数字
  6. 媒体管理工具Media Encoder 2022 for Mac
  7. UE4/UE5 WebBrowser无法播放直播流的问题
  8. 太阳时的计算的Python程序
  9. 51nod 1534棋子游戏(分析)
  10. 谷歌创建新账号时手机号码无法验证
  11. 使用Git上传项目到Gitgub
  12. 20145322何志威 Exp7 网络欺诈技术防范
  13. 双系统卸载ubuntu
  14. win10打开Android模拟器后电脑重启问题
  15. 读松下幸之助自传有感
  16. Flash鼠绘入门第八课:绘制脱俗荷花-Flash鼠绘脱俗荷花教程(6)
  17. base64模块在python2与python3中的区别
  18. android apk自动安装包下载,apk安装包管理app下载-apk安装包文件管理 安卓版v13-PC6安卓网...
  19. 2020车工(中级)模拟考试系统及车工(中级)考试软件
  20. 《Photoshop+Lightroom数码摄影后期处理经典教程》—第1章1.3节存储照片

热门文章

  1. 为NLP从业者/研究生/研究员专门定制的全网唯一高端NLP训练营
  2. 电击、警棍、爆头,被骗去柬埔寨的程序员有多惨?
  3. 用户管理之用户的查询获取
  4. mongodb和python交互
  5. 爬虫之 lxml模块的安装与使用示例
  6. MySQL数据库分组和聚合函数组合使用
  7. pycharm 在ubuntu18.04 20.04以上保存在侧边栏的方法
  8. MATLAB_9-模式识别笔记
  9. C语言,分解质因数一个解法!_只愿与一人十指紧扣_新浪博客
  10. PanoNet3D:一个基于激光雷达点云语义和几何理解的3D目标检测方法