我们一般都是对数组进行快速排序,如何对链表进行快排呢?
主要的步骤在patition里
主要是用两个指针i和j
- 如果j.val大于flag,则j往后移
- 如果j.val小于flag,则swap(j.val,i.next.val)
这样最终小的元素在左边,大的元素在右边
注意这里面交换的i.next的值,因为这里面i指向的元素一直都是小于等于flag的,我们要把大于flag的元素交换到后面.
而且注意,这里的交换都是值交换
例子:
初始状态
因为j.val < flag, swap(j.val, i.next.val),因为此时j与i.next相同,其实没有改变
此时,j.val > flag,继续
此时,j.val > flag,继续
因为j.val < flag, swap(j.val, i.next.val),
此时j==结尾, swap(begin.val, i.val);
一趟快排就好了
1 | /** |
在leetcode上有题要求用nlog(n)的时间复杂度对链表进行排序,用此处的代码会超时,
是因为快速排序采用了递归,容易栈溢出,而且每次我们都采用第一个元素作为flag,这样做并不好,如果采用平均值作为flag,速度会快很多。