快排

void quick_fuck(int left, int right){
    int i , j , t, temp;
    if(left > right)
    return;
    temp = a[left];//基准数(a[left]) 
    i = left;
    j = right;
    while(i != j){    //当ij相遇时停止循环 
        while(a[j] >= temp&&i < j) j--;//注意等于不要漏了 否则很可能中途停止 
        while(a[i] <= temp&&i < j) i++;//先右再左 否则可能会交换一个大于基准数的数作为下一次的基准数 
        if(i < j){//相遇时顺序是正确的 应退出循环 交换基准数 
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[left] = a[i];//交换基准数 
    a[i] = temp; 
    quick(left,i-1);//递归
    quick(i+1,right);//递归 
    return ;//实际上可以看作一个二分 把每一个分为左右两个部分 每个部分的终止条件是 基准数的位置等于下一个基准数的位置  即这个部分仅剩一个基准数未排序 
}

描述一下快排看看自己是否掌握:
1 将最左边的数字定为基准数
2 从右边开始搜索 遇到小于基准数的数则停下
3 左边开始搜索 遇到大于基准数的数则停下
4 交换左右搜索到的数
5 一直重复 知道左右相遇 不再搜索 将基准数与相遇的数交换 获得一个新的基准数
6 此时原基准数左边都小于基准数 右边都大于
7 将原基准数分隔的两部分重复以上步骤 (包括此条)

具体实现时注意的细节:
1 先右后左
2 设置temp存放基准数
3 终止条件:正常顺序执行结束或者到了最后剩基准数时结束

程序的实现步骤
1 读取初始的 left & right
2 设变量(包括两个搜索下标 一个交换的中间值 一个交换基准数的中间值)
3 赋值于变量(基准数 两个下标)
4 设置循环 下标相等时结束
5 循环里模拟从右往左与从左往右的循环 (两个条件皆可退出该循环)
6 交换
7 直到退出循环 交换基准数
8 设置两个递归 变量为原基准数左右两边的新基准数与新最右
9 return;

第一次复习:基本上按照原来的代码敲了一遍 用了4分钟左右 但是交换基准数的时候写错了..
debug又花了几分钟 下次试着不复习直接敲看看敲bu

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是我在学习数据结构时作笔记的用途,这篇文章会纪录下我学习的几种排序算法,以及在学习的时候会加上配图说明! ...
    凌云壮志几多愁阅读 1,605评论 0 3
  • 思想: 快排法主要是运用二分法的思想来对一批数字进行排序,这种排序方法好处是比冒泡排序节省时间,因为冒泡排序是两两...
    逍然阅读 1,722评论 0 1
  • 普通介绍快排的资料,在进行partition的时候,经常是使用两个“指针”i和j: 从前往后扫描,遇到比比较值大的...
    leibnist阅读 662评论 0 2
  • 今天开始复习一下排序,其实这个最近都有再捡起来练,毕竟太久远拿起来还挺不容易的。简单说一下——自己复习排序的时候理...
    AceCream佳阅读 1,298评论 2 7
  • 快速排序,面试必问题。面试百度时三次面试被问到快排,本以为掌握的很好,但细节方面还是不到位,发挥的不是很好,特此记...
    王韩峰阅读 348评论 1 2