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

来源:互联网 发布:巨人网络注册 编辑:程序博客网 时间:2024/06/08 00:47

#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);
      }
}

原创粉丝点击