快速排序的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