排序算法:快速排序(挖坑填数+分治)

复习一下 浓缩一下

http://blog.csdn.net/morewindows/article/details/6684558这篇文章是必看的


例:72 6 57 88 60 42 83 73 48 85

只需要挖72,然后从85开始向前找一个比72小的,放到72,挖出新坑,从6开始找比大的,找到再挖出新坑,循环即可,直到左右标记位相遇。这样就是完成一次。

然后再对72左边和右边的区间递归,递归终止的条件是要递归的区间中只有一个数。

  1. //快速排序  
  2. void quick_sort(int s[], int l, int r)  
  3. {  
  4.     if (l < r)  
  5.     {  
  6.         //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1  
  7.         int i = l, j = r, x = s[l];  
  8.         while (i < j)  
  9.         {  
  10.             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
  11.                 j--;    
  12.             if(i < j)   
  13.                 s[i++] = s[j];  
  14.               
  15.             while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
  16.                 i++;    
  17.             if(i < j)   
  18.                 s[j--] = s[i];  
  19.         }  
  20.         s[i] = x;  
  21.         quick_sort(s, l, i - 1); // 递归调用   
  22.         quick_sort(s, i + 1, r);  
  23.     }  
  24. }  

点评代码:1.如何实现先从右找,找到了再换左找呢?他是放置了一右一左两个while。

2.最后坐标相遇,把初始挖的值放到最后坑位中

3.最后进行左右递归


快速排序搞定!开开心心去面试了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值