← 博客Sorting
merge sort
LC 148: sort a linked list
快慢指针分成两半,断开中间,分别递归排序,最后升序合并两个链表。边界条件:head==None or head.next==None
LC 23. Merge k Sorted Lists
注意边界情况
quick sort
以数组某个元素(一般选取首元素)为基准数,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。
python模版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| def partition(nums, left, right):
pivot = nums[left]#初始化一个待比较数据
i,j = left, right
while(i < j):
while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数
j-=1
nums[i] = nums[j] #将更小的数放入左边
while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数
i+=1
nums[j] = nums[i] #将更大的数放入右边
#循环结束,i与j相等
nums[i] = pivot #待比较数据放入最终位置
return i #返回待比较数据最终位置
def quickSort(self, nums, low, high):
if low<high:
pivot=self.partition(nums, low, high)
self.quickSort(nums,low, pivot-1)
self.quickSort(nums, pivot+1, high)
|
215 数组中的第K个最大元素
灵神题解
视频讲解
时间复杂度:O(N/2)+O(N/4)+O(N/8)+…=O(N)
partition(l,r)的作用:
在闭区间[l,r]上,选一个 pivot,把它放到排序后应该在的位置上,保证它左边的都小于等于它,右边的都大于等于它
- pivot 放到最左边
- i 从左往右找 第一个 >= pivot
- j 从右往左找 第一个 <= pivot
- 交换这两个错位元素
- 最后把 pivot 和 j 交换