• 冒泡排序


    原理:比较两个相邻的元素,将值大的元素交换至右端。

    思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;

    依次类推,每一趟比较次数-1

    外层循环的作用是:

    提取出目前未排序数组中最大的数,放置于已排数据的左边。也就是说我们第一次外层循环,是把最大数的位置交换到数组的最右边,第二次外层循环是把次大数交换到数组的次右边,依次类推。

    内层循环的作用是:

    实现我们想要的大数下沉的过程。每次比较的是相邻两个数据,所以一个数组的长度为n,我们只需要做 n-1 次相邻的比较,就可以实现大数下沉,而 之前循环已经沉淀的大数并不需要再进行 排序了。

    很清楚的看到N个数字要排序完成,总共进行N-1趟排序

    为什么外层循环判断条件是i<n-1呢?

    n 个数字总共需要 n-1 趟排序,外层循环 i 从0到 n-1 正好是 n-1 次。

    为什么内层循环判断条件是j<n-i-1呢?

    这要从冒泡排序原理说起:冒泡排序每循环排序一次,就把最大的一个数排在了最右边(默认升序排),每一次排序都是在上一次排序的基础上再排序,(比如)第2次排序之后,i已经成2了,第三次排序是要在第二次的基础上在进行排序,而第二次排序后就已经把两个最大的数已经放到最后了,所以第三次排序就不需要在去比他俩,就得把这个“2“减掉,只需要循环n-i次(此时的i是2);为什么-i之后还要-1呢? 这是因为在内层循环的判断中是把当前值和后面一个值做比较的。如果不减1,则当循环到最后一个值的时候,再取下一个值就取不到,就需要额外的操作,或者抛出数组下标越界的异常。

    代码示例:

    li = [23,56,1,89,56,41,800,22,1,44,99,0]
    print(len(li))
    for i in range(len(li)):
    for j in range(len(li)-i-1):
    print(i,j)
    if li[j]>li[j+1]:
    li[j], li[j+1] = li[j+1], li[j]
    print(li[j],li[j+1],li)
  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/xiaofeng91/p/13490771.html
Copyright © 2020-2023  润新知