C语言快速排序,从冒泡排序算法扩展出递归的智慧

其实有不少排序算法比快速排序要快,也有不少算法更具有优势,但在众多面试笔试中考的最多的仍然是快排。它是O(nlogn)时间排序算法中最容易理解和实现的(注意这里的用词,容易理解不必定容易实现,例如对树类结构不熟悉的算法可能不太容易实现堆排序,而快速排序并无引入新的数据结构)。面试

(假设咱们须要排序从左到右是从小到大)快速排序基于一个要点,选一个标杆,比标杆小的放左边,比标杆大的放右边。而后分配好的左右两组再各自选一个标杆,再实现其各自分组的“比标杆小的放左边,比标杆大的放右边”,如此递归往复,最终最细颗粒度的都排好序,整个数组就排好序了。算法

方法上简单,但具体怎么高效地实现“比标杆小的放左边,比标杆大的放右边”这个功能,就颇有讲究:数组

新建2个同样长度的数组,a数组放比标杆小的,b数组放比标杆大的?而后再遍历?那么这样须要多2倍的存储空间。数据结构

快速排序在实现“比标杆小的放左边,比标杆大的放右边”,巧妙地采起“左右换位,两边缩小的方法”,只在原数组操做就实现的换位,不须要额外的数组存储空间,跟冒泡ui

代码以下:code

void quick_sort(int* nums, int left, int right){
    int init_right = right;
    int init_left = left;

    bool from_right_search = true;
    int i_m = left;
    int middle = nums[i_m];
    left += 1;
    while(left <= right){
        if(from_right_search){
            if(nums[right] <= middle){
                int tmp = nums[right];
                nums[right] = nums[i_m];
                nums[i_m] = tmp;
                from_right_search = false;
                i_m = right;
            }else{
                right -= 1;
            }
        }else{
            if(nums[left] > middle){
                int tmp = nums[left];
                nums[left] = nums[i_m];
                nums[i_m] = tmp;
                from_right_search = true;
                i_m = left;
            }else{
                left += 1;
            }
        }
    }
    // printf("%d, %d, %d---", init_left, i_m, init_right);
    if(init_left < i_m - 1){
        if(init_left + 1 == i_m - 1){
            if(nums[init_left] > nums[i_m-1]){
                int tmp = nums[init_left];
                nums[init_left] = nums[i_m-1];
                nums[i_m-1] = tmp;
            }
        }else{
            quick_sort(nums, init_left, i_m-1);
        }
    }
    if(i_m+1 < init_right){
        if(i_m+2 == init_right){
            if(nums[i_m+1] > nums[init_right]){
                int tmp = nums[i_m+1];
                nums[i_m+1] = nums[init_right];
                nums[init_right] = tmp;
            }
        }else{
            quick_sort(nums, i_m+1, init_right);
        }
    }
}
相关文章
相关标签/搜索