普通的排序方法有:冒泡排序法,顺序比较法,选择排序法 等等,这些排序大同小异,思维简单,容易上手,但是他们共同的缺点是:时间复杂度过高,皆为O(n*n),容易超时,在这种情况之下,快速排序应运而生:
在相同数据量的情况下,快速排序的平均时间复杂度为O(NlogN)
先上代码:
#include<stdio.h>
#define m 5
int a[m+1];
void quicksort(int left,int right)//此排序为从小到大排序
{
int i=0,j=0,tmp=0;
if(left>right)//此为递归结束条件
return ;
i=left;
j=right;
tmp=a[left];//储存基准数
while(i!=j)
{
while(a[j]>=tmp&&i<j)//从左边开始寻找比基准数小的数 (强调,必须从右边开始)
j--;
while(a[i]<=tmp&&i<j)//从右边开始寻找比基准数大的数
i++;
if(i<j)
{
a[i]=a[i]^a[j];//交换两数
a[j]=a[i]^a[j];
a[i]=a[i]^a[j];
}
}
a[left]=a[i];//交换基准数与下标为i(j)的数
a[i]=tmp;
quicksort(left,i-1);//继续在左边处理 ,此处递归
quicksort(i+1,right);//继续在右边处理 ,此处递归
}
int main()
{
int i=0,j=0;
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
quicksort(1,m);
for(i=1;i<=m;i++)
{
printf("%d ",a[i]);
}
return 0;
}
快速排序之所比较快,是因为相比冒泡排序等排序方法,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。