快速排序一轮的代码实现

#include <stdio.h>
void PrintArray(int a[], int arr_len)
{
  int i;
  for(i=1;i<arr_len;i++)
  {
    printf("%d ",a[i]);
  }
  printf("\n");
}
void swap(int a[], int low, int high)
{
  int temp = a[low];
  a[low] = a[high];
  a[high] = temp;
}
int Partition(int a[], int low, int high)
{
  int pivotkey;
  /*low的下标从1开始,数组第一个元素用0占位,其实排序的是从a[1]开始的元素*/
  /*pivotkey作为标记,一次调整后他的左端元素将比它小,它的有段元素将比它大*/
  pivotkey = a[low];
  while(low<high)
  {
    /*分界元素的右侧序列最后一个元素比标记分界元素大,
     右端最后一个元素下标左移,缩小标记分界元素右端序列*/
     while(low<high&&a[high]>=pivotkey)
     {
       high--;
     }
     /*将标记元素右侧开始标记为较大元素(a[high])移动至标记元素(a[low])左侧,
       标记元素移动到开始标记的较大元素位置处*/
      swap(a,low,high);
     /*分界元素的左侧序列第一个元素比标记分界元素小,
     左端最第一个元素下标右移,缩小标记分界元素左端序列*/
     while(low<high&&a[low]<=pivotkey)
     {
       low++;
     }
     /*将标记元素左侧开始标记为较小元素移动至标记为较大元素a[high]右侧,
     开始标记为较小(a[low])的元素移动到开始标记为的较小元素位置处*/
     swap(a,low,high);
   }
   return low;
}
int main()
{
  int a[] = {0,50,10,90,30,70,40,80,60,20};
  printf("一轮快速排序前:");
  int arr_len = sizeof(a)/sizeof(int);
  PrintArray(a,arr_len);
  Partition(a,1,arr_len);
  printf("一轮快速排序后:");
  PrintArray(a,arr_len);
  return 0;
}

整个代码运行如下图:(图中真正参与排序的元素是50~90(即a[1]~a[9]),红色元素0是占位元素,开始low=1,high =9

pivotkey = a[low] =a[0] = 50并且满足while循环1=low<high=9,先是循环内的第一个循环满足low<high(1<9)但不满足a[high]>pivotkey(不满足20>50),

所以循环结束,交换a[low]和a[high]变成了第二行的结果。

紧接着low<high(1<9)而且a[low](a[1]这个时候值为20)小于50,所以low下标加1,low值变成2,这个时候a[low](a[2])值变成10,还是满足循环,所以继续low++

这个时候a[low](a[3])值变成90(不满足a[low]<=pivotkey即不满足90<=50),所以第二个循环结束,交换a[low]和a[high](a[3]和a[9],即90和50)这样就得到了第5行的结果

(20,  10, 50,30,  70,  40,80,  60,90)。

         


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值