插入排序实现&&选择排序实现
萌新刚刚开始学习算法,第一步是学习排序,毕竟算法的四大块“排序,查找,图,字符串”里面,排序是第一位的(PS:今天才知道算法提供的只是一个程序编写思路,一直以为是一个函数,难怪传入参数怎么也实现不出来,好气啊)
话不多说,先上源码!
选择排序:
1 #coding:utf8 2 3 __author__ = "zhoumi" 4 5 class Seltsort(object): 6 def __init__(self,list): 7 self.list = list 8 def sort(self): 9 #错误示例 10 # for num in self.list: 11 # for des in self.list: 12 # if des > num: 13 # continue 14 # elif des == num: 15 # continue 16 # else: 17 # tmp = num 18 # num = des 19 # des = tmp 20 for i in range(len(self.list) - 1): 21 for j in range(i,len(self.list)): 22 #该循环体的len(self.list)不需要-1,否则最后一个数字无法参与排序 23 if self.list[j] >= self.list[i]: 24 continue 25 else: 26 tmp = self.list[i] 27 self.list[i] = self.list[j] 28 self.list[j] = tmp 29 return self.list 30 if __name__ == "__main__": 31 list = [123, 5493, 599, 921,264, 570, 435,444] 32 st = Seltsort(list) 33 print(st.sort())
萌新第一次写的时候,发现总是有最后一个数字不参与排序,把我给气的!后来经过各种折腾(写了老长老长的一段代码),还是没有解决掉,无奈只好找度娘,他告诉我算法的实现一定要注意循环体的执行次数,然后我把21行的len(self.list)-1改成了len(self.list),大功告成!
插入排序:
1 #coding:utf8 2 3 #插入排序(默认要返回顺序递增列表),即从左往右选定基数,将该基数以所在位置为起点,从右往左比较大小 4 #如果碰到a<基数<a+1,此时将基数插入 5 class Insertsort(object): 6 def __init__(self,list): 7 self.list = list 8 #错误示例 9 # def sort(self): 10 # #外层循环负责取base 11 # for i in range(len(self.list) - 1): 12 # #内层循环负责取base左边的值 13 # for j in range(i): 14 # if i == 0: 15 # #此时list[i]为第一个值,不需要作比较 16 # break 17 # #else负责定位比list[i]大的 18 # else: 19 # if self.list[i] < self.list[j]: 20 # self.tmp = self.list[i] 21 # self.count = j 22 # for k in range(self.count,i+1): 23 # if i == k: 24 # break 25 # else: 26 # self.list[i] = self.list[i-1] 27 # self.list[self.count] = self.tmp 28 # i -= 1 29 #---------------------------------------------------------------------------------------------------- 30 31 def sort(self): 32 for i in range(len(self.list)): 33 for j in range(i+1): 34 if self.list[i] < self.list[j]: 35 tmplist = self.list[j:i+1] 36 count = i - j 37 while True: 38 if count != 0: 39 tmplist.append(tmplist.pop(0)) 40 count -= 1 41 else: 42 break 43 self.list[j:i+1] = tmplist 44 else: 45 continue 46 return self.list 47 48 if __name__ == "__main__": 49 list = [1,3,4,5,8,9,2,6,7,0] 50 inst = Insertsort(list) 51 print(inst.sort())
这段插入排序的实现相对来讲比较容易,tmplist.append(tmplist.pop[0])实现的是将末位移动至首位,例如[2,3,4,1]或者[10,11,12,9],但是这个实现对内存的开销比较大,因为增加了一个tmplist作为缓存列表