直接排序也叫分区交换排序
直接排序的思想:即在一个文件中选择一个值,则以这个值为中间值,比它大的放右边,小的放左边,此时可以找出所以比它大的值在右边,比他小的值在左边,此时再将比这个中间值小的再次排序一次 ,大的排序一次,显然有递归的思想在里面
- 快速排序中要知道起始位置与终止位置,上面所说的之间值可以文件中的任意值,在这里还是设为起始位置
- 直到中间值之后就要开始比较大小由于中间值设置为起始位置,所以可以从终止位置开始比较,终止位置在后面,所以一定大于中间值,如果大于则比较终止位置的前一个直到小于中间值时,如果小于则应该放在中间值的前面
- 在遇到终止位置的值小于中间值之后,将这个值移到中间值的前面去,则此时开始比较起始位置的值,起始位置的值在前面,所以是小于中间值的,如果小于则起始位置就加一,向后移,当遇到大于中间值的时候则将这个值移到后面去
- 一直重复2与3的步骤,直到起始位置不小于终止位置时,则表明此时的左边全是小于中间值的值,右边全是大于中间值的值,此时可以递归,在比中间值小的那一边可以将终止位置设为中间值的位置减一,而比中间值大的一边则将起始位置的值加一。一直递归下去,直到起始位置不再小于终止位置时。则表明排序完成。
代码如下:
void QuickSort(int arr[],int begin,int end){
int i,j,temp;
i = begin;
j = end;
temp = arr[i];
if(begin >= end){
return;
}
while(i<j){
while(i<j && temp < arr[j]){
j--;
}
if(i <j){
arr[i++] = arr[j];
}
while(i<j && temp >= arr[i]){
i++;
}
if(i < j){
arr[j--] = arr[i];
}
}
arr[i] = temp;
QuickSort(arr,begin,--j);
QuickSort(arr,++i,end);
}