快速排序的思想是从数组中选定一个元素,将比这个元素小的全部元素放置到数组的一端(具体是右端还是左端需要根据升序还是降序排序而定),比这个元素大的全部元素放到数组的另一端,此时该元素在有序序列中的位置是确定的,接着对剩余两端也进行以上步骤。递归调用这一过程便可以使整个数组有序。
对我来讲,难点在以选定的元素为分界,将比这个元素小的全部元素放置到数组的一端,比这个元素大的全部元素放到数组的另一端。
low,high,array
key=array[low]
while(low<high){
while(low<high&&array[high]>=key){
high--
}
array[low]=array[high];
while(low<high&&array[low]<=key){
low++;
}
array[high]=array[low];
}
array[low]=key
小小的程序段,要注意的点却很多。首先是low<high的判断,只要low和high的位置将要发生变化,那么就需要先判断是否已经达成了low==high的情况。因为实际代码的执行过程中,为了尽量降低时间复杂度和空间复杂度,将数组元素按照值的大小放入对应端的方式是low和high互相赋值,这种方法尤其需要注意的是数组元素的覆盖问题,像示例的伪代码,一开始先将low端第一个元素的值赋给了key,这样low端第一个元素就是可覆盖的,因此我们选择从high端开始进行比较key和数组元素的大小关系,当high端出现不该在high端的值时(不满足array[high]>=key),就可以将这个元素赋值给low端第一个可被覆盖的元素,此时high端的那个元素就又是可覆盖的了,同理就该从low端开始进行比较key和数组元素了,重复以上这个环节,知道low端和high端重合。