zoukankan      html  css  js  c++  java
  • 选择排序、冒泡排序、插入排序、快速排序

    python

    选择排序

      核心思想:

        假设第一个值为最小值,后续所有值与之比较,最后得到最小值的指针(index),然后把这个值和当前列表中第一个值进行置换,进行第二次循环,将第一个值排除,假设第二个值最小,后续所有值与之比较,得到当前循环中的最小值,与之置换,不断重复,直到排序结束 
    1 import random
    2 a = list(range(0,100,5))
    3 random.shuffle(a)
    4 for i in range(len(a)-1):
    5     for y in range(i,len(a)):
    6         if a[y] < a[i]:
    7             a[i],a[y] = a[y],a[i]
    8 print(a)

    冒泡排序

      核心思想:

        两两对比,相邻元素依次对比大小,按照需求将这两个元素位置进行置换,由于冒泡排序有可能在某个时期就已经排序完成,所以当一次置换都没有进行的时候,就是排序已经完成的时候,所以设置一个完成器,也就是x=true,当x=False的时候,说明本次循环一次置换也没有进行,可以终止了由于内循环中对比的是相邻元素,所以需要在循环次数的时候减一,否则角标越界。至于外循环,可以不减一,但由于冒泡排序的功能,一定在列表最后一次循环完成排序,所以最后一次循环冗余。
     
     1 import random
     2 a = list(range(0,100,5))
     3 random.shuffle(a)
     4 print(a)
     5 for i in range(len(a)-1):
     6     x = False
     7     for y in range(len(a)-1):
     8         if a[y] > a[y+1]:
     9             a[y],a[y+1] = a[y+1],a[y]
    10             x = True
    11     if not x:
    12         break
    13 print(a)

    插入排序

      核心思想:

        假设列表中第一个元素在最终排序的结果中位置正确,后一个元素与其对比,如果比这个元素小(从小到大排序),则将这个元素插入其前面,如果比这个元素大,则位置不变,同时将这个不变的元素作为定位,功能与最开始时的第一个元素相同。
    不论与这个定位元素大或小,当插入之后,默认这个已经插入形成的序列,为最后的它们的位置,这个序列后一个元素依次与这个序列中所有元素进行对比,每对比一次插入一次,直至最后形成顺序序列。
     ...

    注意点,由于“插入”元素,所以会将列表加长,需要定位删除之前的这个元素(我的方法,其他代码的也许和我的不一样,具体问题具体分析,我这个代码空间复杂度是不是高一点?

    (ˉ▽ ̄~) 切~~
     

    快速排序:

      核心思路:

        将一个列表中第一个元素单独拿出来(暂且称其为“x”),从后往前进行对比,依次是,如果这个元素小于x,那么使用最后一个元素前一位的元素与x进行对比,直到对比成功(比x小),那么将这个元素赋值在一个元素的位置,成功赋值后,开始从前往后对比,过程与从后往前相同,但要求是将比x大的元素复制在之前比x小的位置,如果当前元素不比x大,那么往后进行对比,直到对比成功(比x大)。直到最后需要赋值的位置与需要对比的位置是一个位置时停止。
    所有的赋值操作,都是赋值在,上一个进行赋值的位置上。
        同时注意结束语句,先判断结束。绝大多数错误都是出在结束语句上。
        最后将上述思路封装为代码,再另外定义一个函数,对代码进行递归调用,分别处理已经对比完大小的左右两侧列表。
        由于列表是可变数据类型,代码中始终操作的是最开始的列表,所以最后的结果,即便是换了名字,内存地址(id)也还是和最开始的列表相同。
     1 import random
     2 a = list(range(1,10))
     3 random.shuffle(a)
     4 def paixv(a,i,j):
     5     x = a[i]
     6     while True:
     7         if i == j:
     8             a[j] = x
     9             break
    10         if a[j] < x:
    11             a[i] = a[j]
    12             i += 1
    13             while True:
    14                 if i == j:
    15                     a[j] = x
    16                     break
    17                 if a[i] > x:
    18                     a[j] = a[i]
    19                     j -= 1
    20                     break
    21                 else:
    22                     i += 1
    23         else:
    24             j -= 1
    25     return i
    26 
    27 def cs(a,i,j):
    28     if i < j:
    29         x = paixv(a,i,j)
    30         cs(a,i,x-1)
    31         cs(a,x+1,j)
    32     return a
    33 print(a)
    34 a = cs(a,0,len(a)-1)
    35 print(a)
     
     

  • 相关阅读:
    javascript数据结构
    uni-app — 一套前端开发跨平台应用的终极解决方案
    从函数式编程到Ramda函数库(二)
    从函数式编程到Ramda函数库(一)
    node.js爬取数据并定时发送HTML邮件
    vue cli3.0 结合echarts3.0和地图的使用方法
    vue加载优化策略
    C#时间格式化
    wpf 调用线程无法访问此对象,因为另一个线程拥有该对象。
    使用oracle数据库开发,异常总结
  • 原文地址:https://www.cnblogs.com/diyudewudao/p/14027707.html
Copyright © 2011-2022 走看看