快速排序

快速排序

1.  找一个基准值,值左边的数比它大,右边的数比它小

2.  然后对基准值左边的数进行递归排序,对基准值右边的数进行递归排序

#include<stdio.h>
void quick_sort(int *a,int start,int end)
{
 if(start >= end)  //递归结束条件;当start>=end说明一次排序已经完成,准备进行下一次排序
  return ;
 int i = start,j=end;
 int temp = a[start];  //取基准值
 while(i<j)
 {
  while(temp < a[j]) //j从右到左遍历,右边的数应该比基准值大,碰到的第一个比基准值小的数停止遍历,此时a[j]的值不变,需要比基准值大的数来填补空缺 
   j--;   //此时数值下标为j
  if(i<j)
  {
   a[i] = a[j]; //a[j]覆盖a[i],基准值右边的数比基准值大,左边的数比基准值小,
   i++;   //i从左到右遍历,基准值位置的数发生变化,找到比基准值大的数填补a[j]的空缺
  }
  while(temp > a[i] && i<j) //当a[i]比基准值小时,i向右移动
   i++;    //循环结束的条件是碰到a[i]>基准值
  if(i<j)
  {
   a[j]  = a[i];
   j--;
  }
 }
 a[i] = temp;     //因为基准之被覆盖了,此时获取基准值,第一次循环结束,基准值左边的数比基准值小,右边的数应该比基准值大
 quick_sort(a,start,i-1);  //对基准值左边的数进行递归排序
 quick_sort(a,i+1,end);   //对基准之右边的数进行递归排序
 return ;
}
int main(int argc, const char *argv[])
{
 int a[] = {4,2,1,0,5,8,9,6,3,7};
 int num = sizeof(a)/sizeof(int); //获取数组a元素个数
 quick_sort(a,0,num-1);    //数组元素下标是0——n-1
 int i;
 for(i=0;i<num;i++)
  printf("%5d",a[i]);
 printf("\n");
 return 0;
}
posted @ 2019-05-08 16:23  莫负年华向东流  阅读(110)  评论(0编辑  收藏  举报