Task 03 数组排序相关
这一期是关于数组的相关排序思想,冒泡排序、选择排序、插⼊排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。虽然说应该锻炼下排序思想,但是好多地方都用了sort()函数,下面对比较生疏的几种排序算法简单记录一下。
归并排序
思想:先递归均分两个子序列,再两两合并为有序序列
def merge(arr1, arr2):
c = []
h = j = 0
while j < len(arr1) and h < len(arr2):
if arr1[j] < arr2[h]:
c.append(arr1[j])
j += 1
else:
c.append(arr2[h])
h += 1
if j == len(arr1):
for i in arr2[h:]:
c.append(i)
else:
for i in arr1[j:]:
c.append(i)
return c
def merge_sort(lists):
if len(lists) <= 1:
return lists
middle = len(lists)/2
left = merge_sort(lists[:middle])
right = merge_sort(lists[middle:])
return merge(left, right)
if __name__ == '__main__':
a = [4, 7, 8, 3, 5, 9]
print merge_sort(a)
堆排序
用0912 排序数组举例了就。
题目很简单,一个整数数组按照升序排列。
func heapSort(nums []int) {
n := len(nums)
var heapify func(root, length int)
heapify = func(root, length int) {
//堆顶元素下标从0开始
//左右节点的下标
left, right := root * 2 + 1, root * 2 + 2
largest := root
if left < length && nums[left] > nums[largest] {
largest = left
}
if right < length && nums[right] > nums[largest] {
largest = right
}
if root != largest {
nums[root], nums[largest] = nums[largest], nums[root]
heapify(largest, length)
}
}
//先建初堆
for i := n / 2 - 1; i >= 0; i-- {
heapify(i, n)
}
//真正的排序操作(i就代表了当前堆的大小)
for i := n - 1; i > 0; i-- {
nums[0], nums[i] = nums[i], nums[0]
heapify(0, i)
}
}