该算法依赖于两个命名为low和high的标记,这两个标记用来跟踪数组内的位置。开始时,low指向数组中的第一个元素,high指向末尾元素。首先吧第一个元素(分割元素)复制给其他地方的一个临时存储单元,从而在数组中留出一个“空位”。接下来,从右向左移动high,直到high指向的元素小于分割元素时停止。然后把这个数复制给空位,这将产生一个新的空位(high指向的)。现在从左向右移动low,直到low指向的元素大于分割元素。然后把这个数复制给high指向的空位。重复此操作,直到low和high指向相同的元素时停止。此时两个标记(low和high)都指向空位,只要吧分割元素复制给空位就可以了。
现在分割元素左侧的所有元素都小于(或等于)12,右侧的元素都大于(或等于)12。接下来进行递归快排就可以了。
#include<stdio.h>
#define N 10
void quicksort(int a[],int low,int high);
int sort(int a[],int low,int high);
int main(){
int a[N];
int i;
for(i=0;i<N;i++){
scanf_s("%d",&a[i]);
}
quicksort(a,0,N-1);
for(i=0;i<N;i++){
printf("%d ",a[i]);
}
return 0;
}
void quicksort(int a[],int low,int high){ /*递归快排*/
int middle;
if(low>=high) return ; /*low和high指向同一元素就停止*/
middle=sort(a,low,N-1); /*先找到定位分割元素应该在的位置,即low和high指向的空位*/
quicksort(a,low,middle-1); /*对分割元素前的元素进行递归排序*/
quicksort(a,middle+1,high);/*对分割元素后的元素进行递归排序*/
}
int sort(int a[],int low,int high){ /*分割排序*/
int part_element=a[low]; /*分割元素*/
for(;;){
while(low<high&&a[high]>=part_element)
high--;
if(low>=high) break;
a[low++]=a[high]; /*把位置不对的数移到空位(low指向)并把low向右移*/
while(low<high&&part_element>=a[low])
low++;
if(low>=high) break;
a[high--]=a[low]; /*把位置不对的数移到空位(high指向)并把high向左移*/
}
a[high]=part_element; /*找出分割元素应该在的位置 */
return high;
}