简单排序

  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()
原文地址:https://www.cnblogs.com/Json28/p/10419803.html