一、每日一题
自己写的代码:
这道题还是挺简单的,用之前学习的哈希表统计每个元素的个数,再与 n // 2进行比较即可。我的代码还有可以简化改进的地方,大家也可以试试。
def Duo(nums):
n = len(nums)
num_count = {}
for i in nums:
num_count[i] = num_count.get(i, 0) + 1
if num_count.get(i, 0) > n // 2:
print(i)
nums = [2,2,1,1,1,2,2]
Duo(nums)
二、快速排序
快速排序的优点就是 快!
排序要点:
取一个元素p(第一个元素),使p元素归位。
列表被p分成两部分,左边比p都小,右边比p都大。
递归完成排序。
快速排序的清晰思路过程:
-
选择基准元素:从数组中选择一个元素作为基准(pivot)。通常情况下,可以选择数组的第一个元素、最后一个元素或者中间的元素作为基准。
-
分区过程:将数组中的元素按照基准元素的大小分成两部分,小于基准的放在左边,大于基准的放在右边。这个过程可以使用两个指针来实现,一个指向数组的起始位置,另一个指向数组的末尾,然后向中间移动,直到两个指针相遇。这个分区过程单独写一个函数,在快速排序函数中递归调用
-
递归排序:对分区后的左右两部分进行递归排序。重复上述步骤,直到每个子数组的大小为 0 或 1,即已经排好序。
举例详细图解
举得例子有点麻烦,超级多,但是很清楚,有很多重复的,大家可以略看。
绿色框指的是left指针指向空时,找比p大的数,蓝色框找p小的数。
(函数名partition打错了,小细节别介意,懒得改了。)
(以上都是我自己做的ppt截的图,如有需要请注明出处。)
根据思路写出代码:
def partition(li, left, right):
tmp = li[left] # 将第一个元素设置成变量
while left < right: # 要保证区间内有数字
while left < right and li[right] >= tmp: # 从右面找比tmp大的数
right -= 1 # 右边的下标往左移
li[left] = li[right] # 把右边的值写到左边空位上
while left < right and li[left] <= tmp: # 从左面找比tmp小的数
left += 1 # 左边的下标往右移
li[right] = li[left] # 把左边的值写到右边空位上
li[left] = tmp # 把tmp归位
return left
def quick_sort(li, left, right):
if left < right:
mid = partition(li, left, right)
quick_sort(li, 0, mid - 1)
quick_sort(li, mid + 1, right)
li = [5, 7, 4, 6, 2, 1, 9, 3, 8]
quick_sort(li,0, len(li) - 1)
print(li)
运行结果:
三、学习总结
学习到了排序NB三人组之快速排序,不得不说感觉一下子上难度了,整上函数递归了,不过姐还是看懂了哈哈哈,但是还需要再加强写代码练习,第一天学的哈希表姐现在是有点子熟了哈哈哈,只要多敲多练肯定会有收获的!如果明天有时间的话,我会再把快速排序的思路图解编辑一下(饼先画上,最近过年走亲戚真的不想学习哈哈哈),今天还是把自己哄了一晚上才学习弄出来的这些笔记。给所有过年还在学习的同学们鼓掌(包括我自己哈哈哈),加油!!!
图解安排上了,不算画饼了哈哈哈