插入排序实现&&选择排序实现

萌新刚刚开始学习算法,第一步是学习排序,毕竟算法的四大块“排序,查找,图,字符串”里面,排序是第一位的(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作为缓存列表

posted on 2017-09-29 21:03  小萌新瑟瑟发抖  阅读(275)  评论(0编辑  收藏  举报

导航