其实有不少排序算法比快速排序要快,也有不少算法更具有优势,但在众多面试笔试中考的最多的仍然是快排。它是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); } } }