快速排序

排序是最基础也是重要的一种排序,在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;
}

posted @ 2019-03-19 20:09  月为暮  阅读(142)  评论(0编辑  收藏  举报