zoukankan      html  css  js  c++  java
  • 选择、冒泡、插入排序算法总结

    本文做的排序都是默认升序排序,即从小到大,此为大前提

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------

    l = [2, 5, 3, 6, 1, 4, 0, 9, 18, 11, 15, 12]
    
    # 选择排序:依次拿一个元素(从第二个元素开始)和第一个位置元素比较,
    # 如果比第一个元素小就交换位置,这样第一次循环结束,最小的数就放在了第一个,以此类推
    # 第一层循环确定元素要放的位置,所以i的取值范围是数组长度减1,因为最后一个不用比较了,肯定是最大的,
    # 第二层循环控制每次的循环次数,要从i+1个元素开始与第i个元素比较,所以j的取值范围是i+1到数组的最后一个即len(l)
    for i in range(len(l) - 1):
        for j in range(i+1, len(l)):
            if l[i] > l[j]:
                l[i], l[j] = l[j], l[i]
    print(l)
    # 冒泡排序:相邻的两个元素比较,后一个元素比前一个元素小,两个元素互换位置,
    # 那么第一次循环结束,最大元素就到了数组的最后一个位置,以此类推
    # 第一层i确定总循环次数,总循环次数为数组长度减一,
    # 例:只有一个元素的数组,是不用比较的,即比较次数为0,两个元素的数组,只需比较一次,比较次数=数组长度-1,以此类推
    # 第二层j,控制每次循环比较的次数,比较次数是递减的,大循环(i)每执行一次,就少一个需要比较的值,所以j的取值范围是len(l)-i-1
    
    for i in range(len(l)-1):
        for j in range( len(l)-i-1):
            if l[j] > l[j+1]:
                l[j], l[j+1] = l[j+1], l[j]
    print(l)

     # 插入排序:数组可以分为两部分,一部分是有序数组,另一部分是无序数组,从无序数组里依次取值,跟有序数组比较插入# i代表从无序数组取到值的下标,j代表有序数组里值的下标# i从第二个元素开始即下标起始值是1,所以i的取值范围是从数组的第二个值的下标(1)到数组的最后一个值的下标,

    # 第一个元素看作是有序数组的第一个元素即j的起始值,
    # j的起始值都是从i-1开始,依次递减,到0
    for i in range(1, len(l)):
        x = l[i] # x代表未排序的值
        j=i-1
        for j in range(j, -2, -1):    # j标记的是当前位置的值的下标
            #j代表的是有序(默认升序)数组里的下标
            if l[j] > x:    # 如果有序数组里的最大值比未排序的值大,那么未排序的值就该往有序数组里插入,否则退出本次循环
                l[j+1] = l[j]   # 把有序数组的最大值的下标改为未排序值的下标,此时,未排序值就被摘出来了,因为未排序值的下标和已排序的最大值的下标对应的值是一样的,都是已排序数组的最大值
    # 即把有序数组的最大值往后挪了一位,此时,下标为j和j+1指向的两个值是一样的
    else: break # 如果第一次循环就执行到这里,此时j=i-1, 及j的值指向有序数组的最大值,那么下面那行代码不过是本身的值赋给本来的下标了 l[j+1] = x # 如果是最后一次,那么就是当前循环(i)找到的最小值,插入到下标为0(因为循环正常结束,j的值是-1)的地方 # 如果是中间次数,那么l[j]>x不成立,退出本次循环,此时,j已指向前一个值,比如上次循环j的值为3,那么下标3和4的值是一样的, # 因为3的值被赋给了4,那么本次循环j的值是2,所以j+1指向3,该值就插到了3的位置上,即比2的值大并且比4的值小
      
    print(l)
  • 相关阅读:
    uniapp IOS使用uni.getLocation获取不到具体城市名字
    uniapp 打开[ios/安卓]GPS定位权限
    for循环中利用计时器使用let和var
    uniapp 调起底部输入框textarea聊天页面被键盘顶起
    父子组件传布尔类型,发现有问题一直传字符串
    Kafka学习-基础知识
    剑指offer-删除链表中重复的节点
    LEACH协议原文详解
    主流机器学习框架
    算法工程师-职位描述
  • 原文地址:https://www.cnblogs.com/chongzi1990/p/10304099.html
Copyright © 2011-2022 走看看