快速排序<参考数据结构>

#include <stdio.h>
#define NR(x) sizeof(x)/sizeof(x[0])

int partitions(int a[],int low,int high);
void quicksort(int a[],int low,int high);

void print(int *a,int count){ //打印数组
  int i;
  for(i=0;i<count;i++){
     printf("%d ",a[i]);
  }
   printf("\n");
}

int main(void){
  int a[]={12,68,0,1,65,2,23,1,5,99,30,12};
  print(a,NR(a));  //排序前打印
  quicksort(a,0,NR(a)-1);
  print(a,NR(a));  //排序后打印
return 0;
}
/*
 将数组小标为0的的值(a[0]),作为排序基准值。
 将low=0,high=NR(a)并取对应的基准值对比,即分成两端进行
  1、high端,比基准值小的往则将对应的值往low端扔,扔完high自身减去1.否则自身减去1
  2、low端,如果比基准值小或者等于基准值,则low--,否则将low对应的值往高处high扔,并且high自身减去1
  3、由于1步骤中将low值覆盖,因此当low=high时 low对应的数值元素刚好为基准值
*/
int partitions(int a[],int low,int high){
    int pivotkey=a[low];   //将比较的key设置为数组的最低值
   //  printf("%d\n",pivotkey);
    while(low!=high){ //当low!=high时进行比较操作
        while(a[high]>pivotkey&&low<high)  //1、low<high,当最高位大于基准时,不进行交换。并将最高位的下标减1
                   high--;
         if(low<high){  //2、low<high,在1的基础上推出,a[high]<=pivotkey时,将小标为high的值给a[low],并且low自身加1
            a[low++]=a[high];
          }
         while(a[low]<=pivotkey&&low<high)//3、当数组下标最低为low的值小于或等于基准时,low自身+1
               low++;
         if(low<high){   //4、当low<high时,在3的基础上推出a[low]>pivotkey时,并交换最高位和最低位
           a[high--]=a[low];
          }                             
                
   }
   a[low]=pivotkey;//此时low=high
 
 //  print(a,NR(a));
   return low;   
}


void quicksort(int a[],int low,int high){
      int pivottag;  
     if(low<high){
         pivottag=partitions(a,low,high);
         qsort(a,low,pivottag-1);            //二分法进行分段递归排序
         qsort(a,pivottag+1,high);
      }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值