快速排序跟归并排序是一样的,采用的是分治的思想。其实现是每次将数组分为两个部分,一部分小于某个值,一部分大于某个值。当这样一直拆分下去,最后归并就得到一个排序好的数组。
下面来看一下C++实现,partition函数是将一个数组的一部分,拆分为两半的过程,选取了数组这部分的最后一个元素,然后将小于这个元素的移到这部分靠前部分,大于这个值的移到靠后部分,最后有一个这个值的位置,这样就确定了这个值的位置,并将数组的这部分拆成小于这个值的部分和大于这个值的部分。
int partition(int *array, int start, int end){
int mid_value = array[end];
int pos = start;
int temp;
for(int i = start; i <= end; i++){
if(array[i] < mid_value){
int temp = array[pos];
array[pos] = array[i];
array[i] = temp;
pos++;
}
}
temp = array[pos];
array[pos] = mid_value;
array[end] = temp;
return pos;
}
然后我们基于上面的进行递归调用,直到最后只剩一个元素的情况下就是自动满足这种查分条件的基本情况。
void quick_range(int *array, int start, int end){
if(start < end){
int mid = partition(array, start, end);
quick_range(array, start , mid - 1);
quick_range(array, mid + 1 , end);
}
}
最后测试的main函数
int main(){
const int ARRAY_LENGTH = 8;
int array[ARRAY_LENGTH] = {5, 2, 4, 7, 1, 3, 2, 6};
quick_sort(array, ARRAY_LENGTH);
std::cout << "[ ";
for(int i = 0; i < ARRAY_LENGTH; i++){
std::cout << array[i] << " ";
}
std::cout << "]" << std::endl;
return 1;
}
运行结果:
[ 1 2 2 3 4 5 6 7 ]