快速排序
快速排序是对于一个给定的序列,首先选择一个基准值(通常选择起始位置的值),将其放到其所对应的排序位置,使得其左边的元素都小于等于他,右边的元素都大于等于他。然后对左右序列执行相同的操作,直到排序完成。
流程:
(1)选择一个元素作为基准(可以选择序列头元素),设置两个游标,i指向序列首位置,j指向序列尾位置;
(2)先从右往左扫描,遇到小于基准值的停止扫描,然后从左往右扫描,遇到大于基准值的停止扫描,交换两者位置,直到i=j。
python代码
class quik_sort():
def sort(self, nums):
if not nums: return []
if len(nums) == 1: return nums
return self.qsort(0, len(nums)-1, nums)
def qsort(self, l, r, nums):
if l < r:
key_value = nums[l]
start = l
end = r
while l < r:
while l < r and nums[r] >= key_value:
r -= 1
while l < r and nums[l] <= key_value:
l += 1
tmp = nums[l]
nums[l] = nums[r]
nums[r] = tmp
nums[start], nums[l] = nums[l], key_value
self.qsort(start, l-1, nums)
self.qsort(l+1, end, nums)
return nums
堆排序
堆排序是利用堆的数据结构来进行排序的一种算法。
堆的定义:堆是一个完全二叉树,每一个父节点的值都大于等于其左右子节点的值的堆称为大顶堆;每个父节点的值都小于等于其左右子节点的值的堆称为小顶堆,堆可以用一个数组进行表示。
大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2]
小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]
堆排序过程:
(1)构造初始堆,升序排列使用大顶堆,降序排列使用小顶堆,从下至上,从右至左进行调整,将大(小)值往上推。
(2)将堆顶元素交换至数组末尾,是的队尾元素最大或最小,调整堆(除去队尾元素),使其仍为一个大顶堆或小顶堆,循环操作,直至排序完成。
升序排序代码:
class heap_sort():
def heap_sort(self, nums):
nums = self.init_heap(nums)
for i in range(len(nums)):
tmp = nums[0]
nums[0] = nums[len(nums)-1-i]
nums[len(nums)-1-i] = tmp
nums[0:len(nums)-1-i] = self.init_heap(nums[0:len(nums)-1-i])
# print('hh')
return nums
#构建堆,也可以用于堆的维护
def init_heap(self, nums):
lenl = len(nums)
ind = lenl // 2 - 1
while ind >= 0:
#从右至左循环将子节点大的值往上
for i in range(ind*2+1, min(lenl-1, ind*2+2)+1):
if nums[ind] < nums[i]:
tmp = nums[ind]
nums[ind] = nums[i]
nums[i] = tmp
ind -= 1
return nums