排序算法——快速排序

原理:文字说不清楚,直接在代码解释了

[08:32:22] gcc quicksort.c 
[08:32:24] ./a.out
1 2 3 4 5 6 7 8 9 10 
[08:32:26] cat quicksort.c 
#include<stdio.h>
void swap(int *a,int *b)//这个是交换懂吧,注意需要使用指针,否则只是使用a,b,对于数组的值是没有交换效果的
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}
int  sort(int a[],int low,int high)//这个函数总体上的功能是一某一个数作为基础数,然后让其左边都比这个数小,右边都比这个数大
{
    int tmp=a[low];//这里把传过来的范围(low~high),选a[low]作为那个基础数
    while(low<high)//如果low还比high小,说明还有些数没循环到,继续循环
    {
        while(low<high&&tmp<=a[high])//用基准数对比最后一个数,如果小于,说明这个数比基准数大,那么high-1让基准数跟倒数第二个比。。。,如果大于,那么就会跳出这个小循环,执行下一条语句swap,让它们互换位置
            high--;
        swap(&a[low],&a[high]);//此时a[high]比a[low]还小,这里的high就不需要再减去1了,因为前面可能还有比基准数大的,这个a[high]还需要进行交换位置呢
        while(low<high&&tmp>=a[low])//不废话,不懂的话就自己模拟执行过程吧
            low++;
        swap(&a[low],&a[high]);
    }
    return low;//需要返回一个数,也就是说以下标为low的数左右两边都已经排好
}
void quicksort(int a[],int low,int high)
{
    if(low<high)//重复执行sort过程,直至low和high为相邻的两个数为止
    {   
        int location=sort(a,low,high);
        quicksort(a,low,location-1);
        quicksort(a,location+1,high);
    }
}
int main()
{   
    int i,a[]={3,1,5,7,2,4,9,6,10,8};
    int len=sizeof(a)/sizeof(a[0]);
    quicksort(a,0,9);
    for(i=0;i<len;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}
[08:32:29]