排序是最基础也是重要的一种排序,在C语言中,排序有很多种:冒泡排序、选择排序、
桶排序、快速排序等等,其中一般不经过优化的排序算法时间复杂度为O(n^2),或者空
将复杂度比较夸张,其中快速排序是经过优化的一种算法,一般数据的复杂度为O(nlogn)
快排思想:首先是一段数据例如:8 9 5 1 3 2 7 4 以第一个数为基准数,将比8大的数放在8的右边,
比8小的放在左边,最后将8放在它应放的位置:7 4 5 1 3 2 8 9 这是第一次交换后的结果,然后在
进行递归调用,调用自身,分别进行处理8左边数据和右边数据。
代码如下:
#include<stdio.h>//与桶排序相比既节省空间,又节约时间。
int a[101],n;//定义全局变量,主函数,子函数都要用到。 全局变量默认为零
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)//防止递归无限调用
return ;
temp=a[left];//找到基准数。
i=left;
j=right;
while(i!=j)//当i==j时遍历完成
{
while(a[j]>=temp&&i<j)//顺序很重要,先从右边找起。
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)//交换位置。 //一定要有这个判断语句,不然会一直循环
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];//基准数归位;
a[i]=temp;
quicksort(left,i-1);//递归调用,左边数排序。
quicksort(i+1,right);//递归调用,右边数排序。
return ;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}