数据结构和算法-排序算法-冒泡排序

##################     排序算法        ######################

"""

排序算法,
我们想要把线性表中的无序序列,排成有序序列,的算法,就是排序算法,

排序算法的稳定性
举例:假设对下面的元组要以他们的第一个数字来排序。
(4, 1)  (3, 1)  (3, 7)(5, 6)
如果你排序之后,(3, 1)  (3, 7)和原来的顺序一样,就是稳定的,否则就是不稳定的,
(3, 1)  (3, 7)  (4, 1)  (5, 6)  (维持次序)
(3, 7)  (3, 1)  (4, 1)  (5, 6)  (次序被改变)

我们说排序就是默认从小到大的,

"""

##################     冒泡排序        ######################

"""

冒泡排序思路

判断本数字和下一个数字的关系,
第一种情况,如果本数字大,把游标和本数字都往后移动,
第二种情况,如果本数字小,本数字不动,游标往后移动,
这样从前到后一轮走下来,最大的数字就移动到最后面了,
然后再执行一轮,一直执行,直到都排好了,
所以设计思路一定是两个循环,1,内层循环负责从第一个数字开始往后和每一个数字比较,如果遇到比本数字小的就交换位置,继续本数字和下面的数字比较,如果比本数字大,就本数字不动,游标往下,2,外层循环负责内层循环的次数,因为每次内层循环都会把最大的放到最后,所以越往后循环的次数就是依次减一
"""

##################     冒泡排序        ######################

# 第一版
def bubble_sort(alist):
    n=len(alist)
    for j in range(0,n-1):
        """
            这是走一轮,只需要走到倒数第二个数字就可以了,所以结尾是n-1,结尾不包含,
            j=0  内循环停止是走到n-2  range(0,n-1)
            j=1  内循环停止是走到n-3  range(0,n-2)
            j=2  内循环停止是走到n-4  range(0,n-3)
            j=n                       range(n-1-j)
        """
        for i in range(n-1-j):
            if alist[i] >alist[i+1]:
                alist[i],alist[i+1]=alist[i+1],alist[i]

# 难点就是range这个地方,先写内层循环,就是走一轮,外层循环控制走几轮,

##################     冒泡排序        ######################

# 第二版
def bubble_sort2(alist):
    for j in range(len(alist)-1,0,-1):
        """
        range(len(alist)-1,0,-1)
        这个产生的序列是:  n-1  n-2  n-3 .... 1
        外层还是在控制内存循环的次数,
        """
        # j表示每次遍历需要比较的次数,是逐渐减小的
        for i in range(j):  # 这个循环还是在控制每次循环他所走的步数,
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1], alist[i]

# 这两种方式,他们的最坏时间复杂度都是n的平方,

##################     冒泡排序        ######################

# 第三版:

# 对于一个有序的序列,[1,2,3,4,5,6]
# 是否可以简化这个过程,怎么优化这个程序,
# 如果从头走到尾,不需要我交换,就说明一遍就足够了,说明就是有序的了,
# 怎么实现,
def bubble_sort3(alist):
    n=len(alist)
    for j in range(0,n-1):
        count = 0
        for i in range(n-1-j):
            if alist[i] >alist[i+1]:
                alist[i],alist[i+1]=alist[i+1],alist[i]
                count += 1
        if 0 == count:
            break

# 这种最优的时间复杂度就是n,最坏的时间复杂度还是n的平方,
if __name__ == "__main__":
    li = [54,26,93,17,77,31,44,55,20]
    print(li)
    bubble_sort(li)
    print(li)

##################     冒泡排序        ######################

##################     冒泡排序        ######################

##################     冒泡排序        ######################

原文地址:https://www.cnblogs.com/andy0816/p/12348239.html

时间: 2024-10-10 01:36:58

数据结构和算法-排序算法-冒泡排序的相关文章

数据结构与算法-排序算法-partial

前言 都什么时代了,还写排序算法的总结? 原因有二.一是别人的精彩永远是别人的,你只有鼓掌的份儿:有些事情实际动手去做了才会有所体会. 二是排序算法是一类基础类的算法,不光是IT从业者真正入门的门槛,也是一些高级算法的关键部分或算法评估的benchmark. 计划说明的算法内容有哪些?  算法的思想.Java代码实现和平均算法复杂度.算法运行完整示例. 参考文献有哪些? wiki[EB/OL] Shaffer C. A. Data Structure and Algorithm Analysis

【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)

直接插入排序: 在序列中,假设升序排序 1)从0处开始. 1)若走到begin =3处,将begin处元素保存给tmp,比较tmp处的元素与begin--处元素大小关系,若begin处<begin-1处,将begin-1处元素移动到begin:若大于,则不变化.再用tmp去和begin--处的元素用同样的方法去作比较,直至begin此时减少到数组起始坐标0之前结束. 3)以此类推,依次走完序列. 时间复杂度:O() 代码如下: //Sequence in ascending order  voi

(2)Java数据结构--二叉树 -和排序算法实现

=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDecimal类Java API —— BigInteger类Java API —— Calendar类Java API —— DateFormat类Java API —— Date类Java API —— HashMap类 & LinkedHashMap类Java API —— JDK5新特性Java

算法和数据结构~各位排序算法的介绍与实现(C#)

排序是指将元素集合按照规定的顺序排列.通常有两种排序方法,升序排列和降序排列.例如,对整数集{5,2,7,1}进行升序排列,结果为{1,2,5,7},对其进行降序排列结果为{7,5,2,1}.总的来说,排序的目的是使数据能够以更有意义的形式表现出来.虽然排序最显著的应用是排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为某些已成型算法的一部分.      总的来说,排序算法分为两大类:比较排序和线性时间排序.比较排序依赖于比较和交换来将元素移动到正确的位置上.令人惊讶的是,并不是所有的

算法 排序(一) 冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 算法原理 冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数均达

【数据结构】选择排序算法示例

基本选择排序编辑 排序算法即解决以下问题的算法: 输入 n个数的序列<a1,a2,a3,...,an>. 输出 原序列的一个重排<a1*,a2*,a3*,...,an*>:,使得a1*<=a2*<=a3*<=...<=an* 排序算法有很多,包括插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等.插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是

数据结构与算法——排序算法

常见排序算法主要有: 插入排序(直接插入排序.希尔排序) 选择排序(直接选择排序.堆排序) 交换排序(冒泡排序.快速排序) 归并排序 基数排序 外部排序 一.直接插入排序 算法思想:在一个待排序列中,从第二个元素开始,依次进行排序,每次都将待排序元素从后往前,依次与前面的元素进行比较,从而将带排序元素移动到一个合适的位置,直到最后一个待排序元素移动到合适位置,则排序完成. 算法特点:最好情况下时间复杂度O(n),最坏情况下时间复杂度O(n2),稳定排序算法 二.希尔排序 希尔排序算法基础:待排序

数据结构复习之排序算法的总结回顾

根据排序过程中借助的主要操作,我们将内排序分为四类: 插入排序类 直接插入排序 希尔排序 选择排序类 简单选择排序 堆排序 交换排序类 冒泡排序 快速排序 归并排序类 归并排序 从算法的简单性来看,我们将7种算法分为两类: 简单算法:冒泡排序.简单选择排序.直接插入排序 改进算法:希尔排序.堆排序.归并排序.快速排序 对7中算法的各种指标进行对比: 平均情况看:显然最后三种算法要胜过希尔算法,并远远超过前3种简单算法. 最好情况看:反而冒泡和直接插入排序要更胜一筹,也就是说,如果待排序序列总是基

[数据结构与算法]排序算法(Python)

1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def insert_sort(arr): length = len(arr) for i in range(1,length): if arr[i] < arr[i-1]: for j in range(i-1,-1,-1): if arr[j+1] < arr[j]: arr[j+1],arr[j] = arr