快排

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

你可能感兴趣的:(快排)