究极短的快排代码【QuickSort】

快排 QuickSort

两边向中间扫描法:取一个基点值,从左往右扫描,基点值左边所有元素小于它,遇到大于基点值的则停下,开始从右往左扫描,右边所有元素大于他,遇到小于基点值则停下,如果这时左右指针不交叉(左指针在基点左边,右指针在基点右边),则交换两个指针当前值,在每一次交换后两个指针均向右向左移动。依次递归则完成排序。

取中间值为基点,如果递归调用时将j换成i,那么x取值时需要向上取整,否则会造成边界问题

建议读者用不同的数组根据代码逻辑模拟 方便理解

void QuickSort(int a[] , int l , int r){
    if ( l >= r ) return ;
    int i = l - 1, j = r + 1, x = a[l + r >> 1] ; //注意x的取值与下面的函数递归调用的参数有关
    while( i < j ){
        while( a[++i] < x );
        while( a[--j] > x );
        if( i < j ) swap(a[i] , a[j]);
    }
    QuickSort(a , l , j);
    QuickSort(a , j + 1 , r);
}

void QuickSort(int a[] , int l , int r){
    if ( l >= r ) return ;
    int i = l - 1, j = r + 1, x = a[l + r + 1 >> 1] ; //注意x的取值与下面的函数递归调用的参数有关
    while( i < j ){
        while( a[++i] < x );
        while( a[--j] > x );
        if( i < j ) swap(a[i] , a[j]);
    }
    QuickSort(a , l , i - 1);
    QuickSort(a , i , r);
}

你可能感兴趣的:(算法与数据结构,算法,数据结构)