选择排序、冒泡排序、插入排序、快速排序
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)
作者: 千纪
出处: https://www.cnblogs.com/diyudewudao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, https://www.cnblogs.com/diyudewudao/ 如有问题, 可邮件(diyudewudao@qq.com).
注:不要在意标题,在某些情况下名字都只是个代号不是。