排序之快速排序

算法思想:快速排序用到了分治法,所谓分治法就是分而治之,将一个大问题分解成若干个规模更小而且和原问题相似的子问题,递归的解这些子问题,各个击破。这也是战争中常用的一个战术。

 具体步骤:(1)首先对一个无序的序列(拿数组a[ ]举例子)进行划分,取第一个数据a[0]作为基准pivot,以此基准将当前数组分为左右两个较小的子区间,左边的所有数据都小于基准pivot,右边的都大于pivot,注意两个子区间的元素可能是有序的,也可能是无序的。划分的关键点在它可以求出基准pivot所在的位置。代码如下:

int partition(int *a,int low,int high)
{
int i,j,pivot;
j=high;
i=low;
pivot=a[i];    //将子区间的第一个元素作为基准

while(i<j)      //从区间的两端交替向中间扫描,直至i=j为止
{
 while(i<j&&a[j]>=pivot)   //从右向左扫描找到小于基准pivot的元素
j--;
if(i<j)                                  //表示找到比基准pivot小的数
{
a[i++]=a[j];           //相当于交换a[i]和a[j],交换后i指针加一
}
while(i<j&&a[i]<pivot)    //pivot相当于在位置j上
i++;                         //从左向右扫描找到大于基准pivot的元素
if(i<j)                           //表示找到比基准pivot大的数
{
a[j--]=a[i];            //相当于交换a[j]和a[i],交换后j指针减一  
}
}
    a[i]=pivot;                         //基准的位置定下来
    return i;                             //返回基准的位置
}


(2)递归排序部分

void quikSort(int *a,int low,int high)
{
int pivotPos;   //记划分后的基准记录的位置 
   if(low<high)    //当区间的长度大于1时进行排序 
   {
    pivotPos=partition(a,low,high);  //对区间low和high进行划分 
    quikSort(a,low,pivotPos-1);      //对基准记录位置左边的元素进行递归排序 
    quikSort(a,pivotPos+1,high);    //对基准记录位置右边的元素进行递归排序 
   }
}


快排代码

#include"stdio.h"
int partition(int *a,int low,int high)
{
int i,j,pivot;
j=high;
i=low;
pivot=a[i];

while(i<j)
{
 while(i<j&&a[j]>=pivot)  
j--;
if(i<j)
{
a[i++]=a[j];
}
while(i<j&&a[i]<pivot)   
i++;
if(i<j)
{
a[j--]=a[i];
}
}
    a[i]=pivot;
    return i;
}
void quikSort(int *a,int low,int high)
{
int pivotPos;   //记划分后的基准记录的位置 
   if(low<high)    //当区间的长度大于1时进行排序 
   {
    pivotPos=partition(a,low,high);  //对区间low和high进行划分 
    quikSort(a,low,pivotPos-1);      //对基准记录位置左边的元素进行递归排序 
    quikSort(a,pivotPos+1,high);    //对基准记录位置右边的元素进行递归排序 
   }
}
int main()
{
int a[100],i,j,n;
printf("please input total number!\n");
scanf("%d",&n);
for(i=0;i<n;i++)
 scanf("%d",&a[i]);
 quikSort(a,0,n-1);
 for(i=0;i<n;i++)
 printf("%d ",a[i]); 
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值