快速排序的C语言实现

#include <stdio.h>
//快速排序算法
/*
b是起始索引号m是终止索引号.
快排的思想是:
1.选取一个基准值.一般选最左边第一个值.
2.把其它元素分为两部分,左部分小于或等于这个基准值.右部分大于或等于这个基准值.而这个基准值是分界线.
快排的过程是:
0.i=第一个元素位置索引号 j=最后一个元素的位置索引号 x等于第i个元素的值
1.从位置j开始从右向左找比x小的值的索引号,这个过程就是每一次j都减小1直到找到为止.i==j终止
2.将比x小的值填入到i索引的位置.也就是j索引中的值.
3.i自增1.
4.比较x与位置i上的元素,小于x则i自加,否则把i位置上的值放入到位置j中.i==j终止
5.如果i==j则进入第6步,否则回到步骤1.
6.返回i的值.
..小于i的索引的值都小于或等于x,大于i的索引都大于或等于x.
..左索引号i等于右索引号是快排终止的条件.
..快排每一次为一个数值找到一个确切的位置.
..返回值是快排下一次排序划分的依据.
*/
int quickpartition(int a[],int b,int m){
    int i,j,x;
    i=b,j=m;
    x=a[i];
    while(i<j){
        while(i<j){
            if(a[j]<x)
                break;
            j--;        
        }
        a[i]=a[j];
        while(i<j){
            if(a[i]>x)
                break;    
            i++;    
        }
        a[j]=a[i];
    }
    a[i]=x;
    return i;
    
}
/*快速排序法是一种交换排序法,就是先选一个基准值,然后把小于等于这个基准值的元素划到左边,大于等于这个基准值的值划到右边.
*先调用排序算法,然后对左右两边也分别递归调用排序算法.
* 递归调用自身
*/
void quicksort(int a[],int b,int m){
    int i,j,k;
    if(b<m){
        k=quickpartition(a,b,m);
        quicksort(a,b,k-1);
        quicksort(a,k+1,m);
    }

}

int main(){
    int a[]={45,38,66,90,88,10,25,45};
    int i;
    quicksort(a,0,7);
    for(i=0;i<8;i++)
        printf("%d\t",a[i]);
    return 0;
}

输出如下:

 输出:

10    25    38    45    45    66    88    90    

 

posted @ 2017-03-16 19:49  夜梦多离殇  阅读(149)  评论(0编辑  收藏  举报