其實有不少排序算法比快速排序要快,也有不少算法更具有優勢,但在衆多面試筆試中考的最多的仍然是快排。它是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); } } }