《啊哈算法》学习笔记——第一章(python)

CH1 排序

桶排序

  • 这个算法就好比有 11 个桶,编号从 0~10。每出现一个数,就在对应编号的桶中放一个
    小旗子,最后只要数数每个桶中有几个小旗子就 OK 了。
  • eg. 2 号桶中有 1 个小旗子,表示2 出现了一次
    在这里插入图片描述
  • 此处的每一个桶的作用其实就是“标记”每个数出现的次数.
  • 桶排序的时间复杂度为 O ( M + N ) O(M+N)
def bucket_sort(L):
    buckets = [0] * ((max(L) - min(L))+1)
    for i in range(len(L)):
        buckets[L[i]-min(L)] += 1
    res=[]
    for i in range(len(buckets)):
        if buckets[i] != 0:
            res += [i+min(L)]*buckets[i]
    return res
bucket_sort(L)

冒泡排序

  • 冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换
    过来。
  • 冒泡排序每两个依次比较,直到最后一个尚未归位的数,已经归位的数则无需再进行比较。
  • 冒泡排序的时间复杂度是 O ( N 2 ) O(N^{2})
  • 冒泡排序的核心部分是双重嵌套循环。
def bubble_sort(L):
	count = len(L)
	for i in range(0, count):
		for j in range(i+1, count):
			if L[i] > L[j]:
				L[i], L[j] = L[j], L[i]
	return L

快速排序

  • 基本思想:快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。
  • eg.给出 6 1 2 7 9 3 4 5 10 8,第一轮选择基准数6,如图:




直到3,i、j相遇,说明此次“探测”结束,交换3和基准数6,

到此,第一轮快速排序结束。同理,继续分别处理基准数左边和右边的。

  • 快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。其实快速排序是基于一种叫做“二分”的思想。
  • 快速排序的最差的时间复杂度是 O ( N 2 ) O(N^{2})
  • 快速排序平均时间复杂度是 O ( N l o g ( N ) ) O(Nlog(N))
def quick_sort(L,left,right):
	if left >= right:
		return L
	key = L[left]
	low = left
	high = right
	while left < right:
		while left < right and L[right] >= key:
			right -= 1
		L[left] = L[right]
		while left < right and L[left] <= key:
			left += 1
		L[right] = L[left]
	L[right] = key
	quick_sort(L, low, left-1)
	quick_sort(L, left+1, high)
	return L
发布了15 篇原创文章 · 获赞 0 · 访问量 335

猜你喜欢

转载自blog.csdn.net/weixin_38279239/article/details/101355874