快排相关知识

来源:互联网 发布:鲁滨逊漂流记java游戏 编辑:程序博客网 时间:2024/05/22 11:56

快速排序
要排序的区间是[begin, end]
0.begin < end
1,val = arr[begin]
2.l = begin, r = end
 2.1保证l< r
 2.2从r往前找到一个小于val的值,r是是指向这个值
 2.3从l往后找到一个大于等于val的值,l是指向这个值的
 2.4交换l和r的值。
 2.5如果l==r,arr[l] = val;
 2.6否则回到2.1
3.假如已确定的值的下标是pos
 递归将[begin, pos - 1]排序,递归将[pos + 1, end]排序


#include<stdio.h>
void quick_sort(int a[],int begin,int end);

int main()
{
 int a[1000],i,n;
 printf("请输入数组个数:");
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  printf("请输入第%d个数:",i+1);
  scanf("%d",&a[i]);
 }
 printf("排序前的数组为:");
 for(i=0;i<n;i++)
  printf("a[%d] = %d\t",i,a[i]);
 printf("\n");
 quick_sort(a,0,n-1);
 printf("排序后的数组为:");
 for(i=0;i<n;i++)
  printf("a[%d] = %d\t",i,a[i]);
 printf("\n");
 return 0;
}

void quick_sort(int a[],int begin,int end)
{
 int key,l,r,t,j;
 if(begin<end)  //0.begin < end
 {
  key = a[begin];  //1,val = arr[begin]
  l = begin;   //2.l = begin, r = end
  r = end;
  while(l<r)   //保证l< r
  {
   while(l<r&&a[r]>=key)  //2.2从r往前找到一个小于val的值,r是是指向这个值
   {
    r--;
   }
   while(l<r&&a[l]<=key)   //2.3从l往后找到一个大于等于val的值,l是指向这个值的
   {
    l++;
   }
   if(l!=r)   //2.4交换l和r的值。
   {
    t=a[l];
    a[l]=a[r];
    a[r]=t;
   }
   if(l==r)   //2.5如果l==r,arr[l] = val;
   {
    j=l;
    t=a[begin];  //易出错不能写成t=key;因为只是把key的值改了。
    a[begin]=a[l];
    a[l]=t;
   }
  }
  quick_sort(a,begin,j-1);   //递归将[begin, pos - 1]排序,递归将[pos + 1, end]排序
  quick_sort(a,j+1,end);
 }
}

 

0 0