快速排序2

思路

前面和 快速排序1 的思想大致一样

1. 找一个基准数先将数组分成三部分(小于基准数部分,基准数,大于基准数部分)再进而递归
2. 区别在于for循环部分
3. 设置一个i,将小于基准数p的部分放在arr[l+1,j]中,将大于基准数p的部分放在arr[j+1,r]中
4. 即判断arr[i]与p的关系,如果arr[i]<p,将arr[i]与arr[j+1]的值交换,然后j++
5. 最后将arr[l]与arr[j]交换,完成arr[l,j-1]<p,arr[j]=p,arr[j+1]>p

代码

#include <stdio.h>

void _quick_sort(int arr[],int l,int r){
    if(l>=r){
        return;
    }
    int p = arr[l];//设置基准数
    int j = l;
    
    // arr[l+1,j]<p; arr[j+1,i]>p
    for (int i = l+1; i<=r; i++) {
        if(arr[i]<p){// <p 放到arr[l+1,j]中
            j++;
            //交换
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;       
        }
        //其他的不做处理自然进入了arr[j+1,r]这一段数组中
    }
    
    //最终结果 arr[l,j-1] < p,arr[j] = p,arr[j+1,r]>p
    int temp = arr[l];
    arr[l] = arr[j];
    arr[j] = temp;
    //递归处理左右部分
    _quick_sort(arr, l, j-1);
    _quick_sort(arr, j+1, r);
    
}


int quick_sort(int arr[],int n){
    
    _quick_sort(arr,0,n-1);
    
    return 0;
}



int main(int argc, const char * argv[]) {
    // insert code here...
    int arr[] = {9,2,1,6,5,4,3};
    quick_sort(arr, 7);
    for (int i = 0; i<7; i++) {
        printf("%d\n",arr[i]);
    }
    return 0;
}
posted @ 2017-05-15 22:47  郑闯  阅读(103)  评论(0编辑  收藏  举报