← 博客

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 交换