1. 快速排序:
class quickSort(): def __init__(self,nums): self.nums = nums[:] def partition(self,left,right): key = self.nums[left] while left<right: while left<right and self.nums[right]>=key: #注意这里有个“=”,用来防止key被来回交换而陷入死循环。 right-=1 while left<right and self.nums[left]<key: left+=1 if left<right: #找到对应位置后交换值。 tmp = self.nums[left] self.nums[left] = self.nums[right] self.nums[right] = tmp print left return left def qs(self,left,right): if left>=right: return index = self.partition(left,right) self.qs(left,index) #每次将数组切成两段,中间没有空余的位置。 self.qs(index+1,right) if __name__ == '__main__': nums = [10,22,1,9,87,3,2,66,1,8,9,0,7,7] s = quickSort(nums) s.qs(0,len(nums)-1) print nums print s.nums 2. 堆排序: class heap: def __init__(self,arr): self.arr = arr def insert(self,value): #insert from the end of arr arr.append(value) self.up() def pop(self): #get the biggest one in array and resort the array top = self.arr[0] arr[0] = arr.pop() self.down() return top def swap(self,child_index,parent_index): arr[child_index],arr[parent_index] = arr[parent_index],arr[child_index] def up(self): child_index = len(arr)-1 while(True): parent_index = (child_index-1)/2 if(parent_index>=0 and arr[child_index]>arr[parent_index]): self.swap(child_index,parent_index) child_index = parent_index else: break def down(self): parent = 0 end = len(arr)-1 while(True): left_child = 2*parent+1 right_child = left_child+1 if(right_child<=end): #has two childern if(arr[left_child]>arr[right_child]): #find the bigger child bigger = left_child else: bigger = right_child if(arr[parent]<arr[bigger]): self.swap(parent,bigger) parent = bigger else: break elif(left_child<=end): #has one child if(arr[parent]<arr[left_child]): self.swap(left_child,parent) parent = left_child else: # bigger than left child break else: #has no children break if __name__ == "__main__": arr = [9,8,7,6,4,5] h = heap(arr) h.insert(100) print h.arr print(h.pop()) print h.arr print(h.pop()) print h.arr 3. 归并排序: def merge(left,right): tmp = [] while(left and right): if(left[0]>right[0]): #将left or right 中,较大的元素弹入tmp;只能从前往后比较,因为每个子序列都是从小到大排列的。 tmp.append(right.pop(0)) else: tmp.append(left.pop(0)) if(left): #将剩余的元素弹入tmp for i in left: tmp.append(i) else: for i in right: tmp.append(i) return tmp def merge_sort(arr): if(len(arr)<=1): return arr mid = len(arr)/2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) res = merge(left,right) return res if __name__ == "__main__": arr = [34,54,94,62,56,46,6,2] print merge_sort(arr)