quicksort算法思想

先贴在分析

void swap(int *x,int *y)
{
   int temp;
   temp = *x;
   *x = *y;
   *y = temp;
}

int choose_pivot(int i,int j )
{
   return((i+j) /2);
}

void quicksort(int list[],int m,int n)
{
   int key,i,j,k;
   if( m < n)
   {
      k = choose_pivot(m,n);
      swap(&list[m],&list[k]);// 把区分用的值放置在大小数组的中间
      key = list[m];//    key是下面划分数组的标准
      i = m+1;// list[m] 已经确定为分组标准不进行判断
      j = n;
      while(i <= j)
      {
         while((i <= n) && (list[i] <= key))
                i++;
         while((j >= m) && (list[j] > key))
                j--;
         if( i < j)
                swap(&list[i],&list[j]);
      }  
     // 假设数组在递归到最后变成二元组 这一步负责交换二元组
      swap(&list[m],&list[j]);
     // 递归地对较小的数据序列进行排序
      quicksort(list,m,j-1);// 将一个完整的数组分成2个小的  然后递归 直至分成一个2元组
      quicksort(list,j+1,n);
   }
}

上动态图

来自维基百科

看懂图题目解决大半

下面开始分析

1.我们先选择数组最中间的那一项, 默认他为数组的大小区分分界线,
2,然后将数组后部大于分界线的移动到前半部分(这里可能有疑问后面说明)
3.然后项的排序就变成了 前x项和后(n - x)项的排序
重复1 . 2. 3步 直至对2个数字进行排序

疑问解释 :

quickrock函数开头部分交换list[m]和list[k]的意义是为了为下面的递归服务
后面的递归交换m和k是因为 k所代表的是分段之后小数组的最大值为了下次筛选我们将他与任意一个值进行交换(这里默认是M因为m一定在小数组内)当然这步也解决了如果数组中间项是数组最大值的问题。
最后所有的分组都完成之后递归向前回溯 从二元组开始一个个排序 然后3元组, 四元组 直至N元 排序完成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值