自己捣鼓了好久,过程中错误百出。
- 对列表进行双向扫描时,设左侧指针指向第left_idx元素,右侧指针指向第right_idx元素。在任何一个状态下,只有前left_idx-1个元素符合pivot左侧条件,后right_idx+1个元素符合pivot右侧条件。
- 扫描终止条件,应该是left_idx > right_idx, 即left_idx == right_idx + 1. 假设是先从左侧开始扫描,可能的有2种情况:①完成最后一次交换②左侧或右侧指针在扫描时移动至终止状态。无论是以上哪种情况,均符合1中所属,即左右指针各自前一个身位乃至更早扫描的元素均符合各侧的要求。
- 如果pivot元素在开始时被移至最左侧,再扫描终止后需将pivot与left_idx-1所对应元素进行换位,再从pivot的位置将列表截断(两个子列表均不含pivot元素),然后对2个子列表进行快速排序。如果开始时pivot被移至最右侧,则扫描终止后需与right+1所对应元素换位。
- 初始时left_idx>=right_idx,则直接结束排序。
个人拙见,欢迎补充。