使用python实现4种in-place排序算法
分别实现了插入排序,归并排序,希尔排序,计数排序四种排序算法
class Solution:
# 插入排序 --前半部分已排好顺序,后半部分未排序
# 当前元素依次向前面已排好顺序中插入
def insert_sort(self,nums):
for i in range(len(nums)):
tmp = nums[i]
preindex = i-1
while preindex >=0 and nums[preindex] > tmp:
nums[preindex+1] = nums[preindex]
preindex -=1
nums[preindex+1] = tmp
return nums
def sheel_sort(self,nums):
#希尔排序 -插入排序升级版
# 重点是构建递增序列 这边使用 3*h +1作为递增列表, 可以不使用gap列表-为了更直观
n = len(nums)
gaps = [1]
h = 1
while h < n/3:
h = 3*h + 1
gaps.insert(0, h)
for gap in gaps:
for i in range(gap,n):
j = i
while j >= gap and nums[j] <= nums[j-gap]:
nums[j], nums[j-gap] = nums[j-gap], nums[j]
j -= gap
return nums
# 计数排序 类似哈希表-记录每个元素出现的次数,再还原
def count_sort(self,nums):
max_value = float('-inf')
min_value = float('inf')
for i in range(len(nums)):
max_value = max(max_value,nums[i])
min_value = min(min_value,nums[i])
count_list = [0] * (max_value - min_value+1)
for i in nums:
count_list[i-min_value] +=1
index = 0
for _ in range(len(count_list)):
tmp_num = count_list[_]
tmp_val = _ + min_value
while tmp_num >0:
nums[index] = tmp_val
index +=1
tmp_num -=1
return nums
def merge_sort(self,nums,l,r):
'''
:param l: 左指针
:param r: 右指针
'''
#归并排序-自上而下的递归- 传入左右边界 in-place
def merge(nums,l,m,r):
# 设置两个左右list变量存储合并的列表-边界值是细节-多次调试
L = [0] * (m - l + 1)
R = [0] * (r - m)
for i in range(m-l+1):
L[i] = nums[l+i]
for j in range(r-m):
R[j] = nums[m+j+1]
i, j, k = 0, 0, l
while i < (m-l+1) and j < (r-m):
if L[i] <= R[j]:
nums[k] = L[i]
i += 1
else:
nums[k] = R[j]
j += 1
k +=1
while i < (m-l+1):
nums[k] = L[i]
i += 1
k += 1
while j < (r-m):
nums[k] = R[j]
j += 1
k += 1
if l < r:
mid = l + (r - l) // 2
self.merge_sort(nums, l, mid)
self.merge_sort(nums, mid+1, r)
merge(nums, l, mid, r)
return nums
if __name__ == '__main__':
nums = [9,8,7,11,5,4,3,2]
A = Solution()
print('希尔排序: ', A.sheel_sort(nums))
print('计数排序: ', A.count_sort(nums))
print('插入排序: ', A.insert_sort(nums))
print('归并排序: ', A.merge_sort(nums, 0, len(nums)-1))