选择排序、冒泡排序、插入排序、快速排序

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)

 

 
 

posted @ 2020-11-23 22:48  千纪  阅读(120)  评论(0编辑  收藏  举报