快速排序其实是冒泡排序的升级版,都具有交换排序的思想。
快速排序通过一遍排序,将数据分为两部分,一部分数据都比另外一部分数据小,然后再分别对这两部分数据再进行此排序,直到排序结束。因此,此排序方法用到了递归。
下面来举个例子:(对69 65 90 37 92 6 28 54 八个数进行排序)
69 65 90 37 92 6 28 54 //以数组的第一个元素为基准base
54 65 90 37 92 6 28 69 //从数组右侧开始,取出数据依次与base进行比较,直到找到小于base的数,然后两者进行交换
54 65 69 37 92 6 28 90 //从数组左侧开始,取出数据依次与base进行比较,直到找到大于base的数,然后两者进行交换
54 65 28 37 92 6 69 90 //从右侧开始,操作与上述相同
54 65 28 37 69 6 92 90 //从左侧开始,操作与上述相同
54 65 28 37 6 69 92 90 //到此步骤,base左边的数都比base小,base右边的数都比base大
然后再通过递归,将base左右两边的数继续按此方法排序,直到排序结束。
#include <stdio.h>
#define ARRAYLEN 10 //比较十个数
int Division(int a[],int left,int right); //声明分割函数,返回基准的序号值
void QuickSort(int a[],int left,int right); //声明快排函数
int main()
{
int i,a[10];
for(i=0;i<ARRAYLEN;i++)
scanf("%d",&a[i]);
QuickSort(a,0,ARRAYLEN-1);
for(i=0;i<ARRAYLEN;i++)
printf("%d ",a[i]);
return 0;
}
int Division(int a[],int left,int right) //分割函数
{
int base=a[left]; //取最左侧元素为基准元素
while(left<right) //左侧序号小于右侧序号
{
while(left<right&&a[right]>base) //从右向左找第一个比基准小的元素
--right;
a[left]=a[right]; //将比基准小的数移到左侧
while(left<right&&a[left]<base) //从左向右找第一个比基准大的元素
++left;
a[right]=a[left]; //将比基准大的数移到右侧
}
a[left]=base; //保存基准数
return left; //返回基准序号
}
void QuickSort(int a[],int left, int right)
{
if(left<right) //当左侧序号小于右侧序号时执行此排序,否侧不执行
{
int i=Division(a,left,right);
QuickSort(a,i+1,right); //对基准右侧的数据进行排序
QuickSort(a,left,i-1); //对基准左侧的数据进行排序
}
}