1 # Author:Json
2
3 class Sort(object):
4 '''
5 this class include bubble sort,insert sort,select sort,quick sort,merge sort and heap sort
6 '''
7
8 def __init__(self, li):
9 self.li = li
10
11 def bubble_sort(self):
12 '''
13 this function is bubble sort
14 :return:
15 '''
16 for i in range(len(self.li) - 1):
17 exchage = False
18 for j in range(len(self.li) - i - 1):
19 if self.li[j] > self.li[j + 1]:
20 self.li[j], self.li[j + 1] = self.li[j + 1], self.li[j]
21 exchage = True
22 if not exchage:
23 break
24
25 def insert_sort(self):
26 '''
27 this function is insert sort
28 :return:
29 '''
30 for i in range(1, len(self.li)):
31 tmp = self.li[i]
32 j = i - 1
33 while j >= 0 and tmp < self.li[j]:
34 self.li[j + 1] = self.li[j]
35 j -= 1
36 self.li[j + 1] = tmp
37
38 def select_sort(self):
39 '''
40 this function is select sort
41 :return:
42 '''
43 for i in range(len(self.li) - 1):
44 min_loc = i
45 for j in range(i + 1, len(self.li)):
46 if self.li[min_loc] > self.li[j]:
47 min_loc = j
48 if min_loc != i:
49 self.li[min_loc], self.li[i] = self.li[i], self.li[min_loc]
50
51 def quick_sort(self):
52 '''
53 this function include "quick_sort_" and "partion"
54 "quick_sort_" is used in Recursive, "partition" used in parting
55 :return:
56 '''
57 left = 0
58 right = len(self.li) - 1
59 self.__quick_sort(left, right)
60
61 def __quick_sort(self, left, right):
62 if left < right:
63 mid = self.__partition(left, right)
64 self.__quick_sort(left, mid)
65 self.__quick_sort(mid + 1, right)
66
67 def __partition(self, left, right):
68 tmp = self.li[left]
69 while left < right:
70 while left < right and self.li[right] > tmp:
71 right -= 1
72 self.li[left] = self.li[right]
73 while left < right and self.li[left] < tmp:
74 left += 1
75 self.li[right] = self.li[left]
76 self.li[left] = tmp
77 return left
78
79 def merge_sort(self):
80 '''
81 this function include __merge_sort,__merge
82 the effect of __merge_sort is breaking down the list
83 the effect of __merge is merging the two ordered list to one ordered list
84 :return:
85 '''
86 low = 0
87 high = len(self.li) - 1
88 self.__merge_sort(low, high)
89
90 def __merge_sort(self, low, high):
91 if low < high:
92 mid = (low + high) // 2
93 self.__merge_sort(low, mid)
94 self.__merge_sort(mid + 1, high)
95 self.__merge(low, mid, high)
96
97 def __merge(self, low, mid, high):
98 i = low
99 j = mid + 1
100 ltmp = []
101 while i <= mid and j <= high:
102 if self.li[i] < self.li[j]:
103 ltmp.append(self.li[i])
104 i += 1
105 else:
106 ltmp.append(self.li[j])
107 j += 1
108 while i <= mid:
109 ltmp.append(self.li[i])
110 i += 1
111 while j <= high:
112 ltmp.append(self.li[j])
113 j += 1
114 self.li[low:high + 1] = ltmp
115
116 def heap_sort(self):
117 n = len(self.li)
118 for i in range(n//2-1,-1,-1):
119 self.__sift(i,n-1)
120 for j in range(n-1,-1,-1):
121 self.li[0],self.li[j] = self.li[j],self.li[0]
122 self.__sift(0,j-1)
123
124 def __sift(self,low,high):
125 i = low
126 j = i * 2 + 1
127 tmp = self.li[i]
128 while j <= high:
129 if j < high and self.li[j] < self.li[j+1]:
130 j += 1
131 if tmp < self.li[j]:
132 self.li[i] = self.li[j]
133 i = j
134 j = i * 2 + 1
135 else:
136 break
137 self.li[i] = tmp
138
139
140
141
142 def test_sort():
143 import random
144 li = []
145 for i in range(1000):
146 li.append(i)
147 random.shuffle(li)
148 a = Sort(li)
149 a.heap_sort()
150 print(li)
151
152
153 test_sort()