class Sort:
def bubble(self, nums):
for i in range(len(nums)-1):
for j in range(len(nums)-1-i):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print('Bubble: {}'.format(nums))
def pick(self, nums):
for i in range(len(nums)-1):
for j in range(i+1, len(nums)):
if nums[i] > nums[j]:
nums[i], nums[j] = nums[j], nums[i]
print('Pick: {}'.format(nums))
def quick(self, nums):
def qsort(nums, l, r):
i, j = l, r
if i >= j: return
pivot = nums[i]
while i < j:
while i < j and nums[j] >= pivot:
j -= 1
nums[i] = nums[j]
while i < j and nums[i] < pivot:
i += 1
nums[j] = nums[i]
nums[i] = pivot
qsort(nums, l, i-1)
qsort(nums, j+1, r)
qsort(nums, 0, len(nums)-1)
print('Quick: {}'.format(nums))
def insert(self, nums):
for i in range(1, len(nums)):
while nums[i]<nums[i-1] and i > 0:
nums[i], nums[i-1] = nums[i-1], nums[i]
i -= 1
print('Insert: {}'.format(nums))
def merge(self, nums):
def chaifen(nums, l, r):
if l >= r: return
m = (l + r) // 2
chaifen(nums, l, m)
chaifen(nums, m+1, r)
innermerge(nums, l, m, r)
def innermerge(nums, l, m, r):
i, j = l, m+1
res = []
while i <= m and j<=r:
if nums[i] < nums[j]:
res.append(nums[i])
i += 1
else:
res.append(nums[j])
j += 1
while i <= m:
res.append(nums[i])
i += 1
while j <= r:
res.append(nums[j])
j += 1
nums[l:r+1] = res[:]
chaifen(nums, 0, len(nums)-1)
print('Merge: {}'.format(nums))
def heap(self, nums):
def innerheap(nums, i=0):
while 2*i+1 <= len(nums)-1:
while nums[i] < nums[2*i+1]:
nums[i], nums[2*i+1] = nums[2*i+1], nums[i]
innerheap(nums, 2*i+1)
if 2*i+2 <= len(nums)-1:
while nums[i] < nums[2 * i + 2]:
nums[i], nums[2 * i + 2] = nums[2 * i + 2], nums[i]
innerheap(nums, 2*i+2)
i += 1
res = []
while nums:
innerheap(nums)
res.insert(0, nums.pop(0))
print('Heap: {}'.format(res))
def bucket(self, nums):
n, res = len(nums), []
bucks = [[] for i in range(n)]
lenrg = max(nums) - min(nums)
minNum = min(nums)
for num in nums:
idx = int(min(max((num - minNum)/lenrg * n, 0), n-1))
bucks[idx].append(num)
for subB in bucks:
if subB:
self.insert(subB)
res += subB
print('Bucket: {}'.format(res))
if __name__=='__main__':
nums = [1,4,2,8,5,7,10,3,9]
s = Sort()
print('Original: {}'.format(nums))
s.bubble(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.pick(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.quick(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.insert(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.merge(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.heap(nums[:])
print('#'*100)
print('Original: {}'.format(nums))
s.bucket(nums[:])
print('#'*100)