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);
        }
    }
}
相關文章
相關標籤/搜索