小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
二、双方向比较快速排序
双方向的快速排序只是和单方向的划分策略不一致,思想大抵是相同的。
int arrange(int arr[], int start, int end){
int x = arr[start];
while(start<end){
while(start<end && arr[end]>=x){
end--;
}
arr[start] = arr[end];
while(start<end && arr[start]<=x){
start++;
}
arr[end] = arr[start];
}
if(start == end){
arr[start] = x;
}
return start;
}
它是使用start和end将数组中的这些元素分成三部分,start前面的部分全是小于等于划分元素x的元素,而end后面的部分全是大于等于划分元素x的元素,在这中间是没有进行区分的元素。当start小于end,也就是划分没有结束时,就一直划分,直到start>=end,与此同时,先让end从右往左遍历,如果遇到比x小的值就停止,然后将其交给start,之后又让start从左往右遍历,直到遇到比x大的值才停止,然后将其交给end,这个end上的值之前已经给到先前的start位置上了。然后start的坐标与end的坐标重合了,这时将之前保存的要划分的元素x放置于此。然后返回这个要划分的元素索引值。
比较两种算法
他俩的时间复杂度是一样的,似乎看起来没什么区别。但是在实际应用中,这两种区别就比较大了,比如如果要给一个1TB的数据进行排序,这时候单方向比较的快速排序就明显好用很多。