简单算法之快速排序

算法思想:
<1>.以数组的最后一个数字为基准数,对数组各个元素进行排序:将比基准数大(或小的)元素移至基准数的左(或右)侧,并基准数为边界将数组分为两个子数组,同时以t作为索引,记录最后一个元素的位置在for循环结束后对进行交换,将基准数移至t所记录的位置的下一个位置。

<2>.调用递归函数对各个子数组进行排序,并以此类推直至排序完成。

代码:
#include<stdio.h>
#define N 50

void Swap(int a[],int x,int y)//实现数值交换
{
 int Temp;//定义中间变量Temp
 Temp=a[x];
 a[x]=a[y];
 a[y]=Temp;
}
int Segmentation(int a[], int L, int R)
{
 
 int x=a[R];//以数组最右端的数字作为基准数,对数组进行排序
 int t=L-1;//以t作为索引,记录最后一个小于基准数的元素的位置
 
 for(int i=L;i<R;i++)
 {
  if(a[i]<=x)
   Swap(a,++t,i);
 }
 Swap(a, t+1, R);//将基准数放到最后一个小于基准数的元素的后一个位置
 
 return t+1;//返回基准数
 
}

void Quicksort(int a[], int L, int R)
{ 
 int  p;
 if(L>=R)
 return;
  
 p=Segmentation(a ,L, R);//以p为基准,对每个数组进行排序

 Quicksort(a, L, p-1);//将数组以p为基准分为两个子数组并对调用递归函数对子数组进行排序
Quicksort(a, L, p-1);
 Quicksort(a, p+1, R);
 
}


int  main(void)
{
 int a[N];
 int n;
 scanf("%d",&n);
 
 for(int i=0; i<n; i++)
 scanf("%d", &a[i]);
 
 Quicksort(a,0,n-1);
 
 for(int i=0 ;i<n ;i++)
 printf("%d ",a[i]);
 printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值