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)
     
     

  • 相关阅读:
    Office办公软件停止工作解决方案
    Jquery blockUI用法
    IE浏览器对js代码的高要求
    IIS中应用程序切换物理路径遇到的问题
    using关键字
    剑指offer-面试题23-链表中环的入口节点-双指针
    剑指offer-面试题22-链表中倒数第k个节点-双指针
    剑指offer-面试题21-调整数组顺序使奇数位于偶数前面-双指针
    剑指offer-面试题20-表示数值的字符串-字符串
    剑指offer-面试题19-正则表达式匹配-字符串
  • 原文地址:https://www.cnblogs.com/diyudewudao/p/14027707.html
Copyright © 2011-2022 走看看