算法入门--快速排序1

时间:2021-02-21 01:10:09
 
#include <stdio.h>
#include <stdlib.h>
/*
快速排序算法,最坏情况的运行时间为O(n*n),平均运行时间为O(n*lgn) 
*/
void exchage(int *a,int i,int j)//交换数组两个数的位置 
{
     int temp;
     temp=a[i];
     a[i]=a[j];
     a[j]=temp;
}
int partition(int *a,int p,int r)//对数组a[p...r]进行就地重排,返回大小为中间的元素位置。 
{
    int i,j,x;
     x=a[r];//记录当前数组最后一个位置,作为分界的主元元素 
    i=p-1;//i用来记录当前的第一个比主元大的元素位置
    j=p;
    for(j=p;j<r;j++)
    {
         if(a[j]<=x)//每当有元素比主元小时,将该元素与最前面的大元素换位置,并移动指示i 
         {
                i++;
                exchage(a,i,j);//交换a[i]与a[j] 
         }                
    }
    exchage(a,i+1,r);//遍历结束后,将主元与最前面的大元素交换位置,保证交换后,左边都小,右边都大 
    return i+1;//返回分割的位置 
}
void quicksort(int *a,int p,int r)//递归进行快速排序 
{
     int q;
     if(p<r)
     {
            q=partition(a,p,r);//产生q的时候,a[q]已经位于正确的位置,再递归排序两边的元素 
            quicksort(a,p,q-1);
            quicksort(a,q+1,r);      
     }
}
int main(int argc, char *argv[])
{
  int a[1000]={0};
  int i,n;
  printf("输入要排序的数量\n");
  scanf("%d",&n);
  printf("输入n个要排序的数\n");
  for(i=1;i<=n;i++)
  scanf("%d",&a[i]);
  quicksort(a,1,n);
  printf("快速排序后\n");
  for(i=1;i<=n;i++)
  printf("%d ",a[i]); 
  system("PAUSE");	
  return 0;
}