时间复杂度:O(n*logn)
定义:在一组无序的数列中,指定一个数为基准值,遍历数列,将比其小的放在左边,比其大的放在右边。这样基准值所在位置即为排序后的最终位置,保持不动。再将基准值左右的数组进行递归。,直到中间只有一个数结束。
方法一:
覆盖法:将第一个元素当成基准值,存储起来。I和J分别指向数组的首位。从后面向前找到比基准值小的数,将I所指的值覆盖,I再向后找比基准值大的数,覆盖J所指的数。当I和J重合时,将基准值覆盖,完成一次循环。
#include<stdio.h>
void quick(int a[],int low,int high)
{
if(low >= high)
return;
int i = low;
int j = high;
int tmp = a[low];
while(i < j){
while(i<j && a[j] >= tmp)
j--;
a[i] = a[j];
while(i<j && a[i] <= tmp)
i++;
a[j] = a[i];
}
a[i]=tmp;
quick(a,low,i-1);
quick(a,i+1,high);
}
int main()
{
int i=0;
int a[9]={12,38,56,0,21,7,9,16,99};
quick(a,0,8);
for(i=0;i<9;i++){
printf("%d ",a[i]);
}
return 0;}printf("\n");
方法二:
交换法:将第一个元素当成基准值,J指向第一个元素。I从第一个数开始遍历数组。碰到不大于基准值的数就和J所指的值进行交换,J前进一位。这样就会将所有比基准值小的数交换到左面。最后基准值再和J所指的前一个数进行交换,完成一次循环。
#include<stdio.h> void quick(int* a,int low,int high) { if(low>=high) return; int tmp=a[low]; int swap=0; int i=0,j=0; for(i=low,j=low;i<=high;i++){ if(a[i]<=tmp){ swap=a[i]; a[i]=a[j]; a[j]=swap; j++; } } j--; swap=a[low]; a[low]=a[j]; a[j]=swap; quick(a,low,j-1); quick(a,j+1,high); } int main() { int i=0; int a[9]={12,38,56,0,21,7,9,16,99}; quick(a,0,8); for(i=0;i<9;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }
结果: