快速排序
前言
快速排序是在面试中最常见的问题之一,如果有幸问到快排,面试官通常都要求应聘者在纸上手写出快排的代码。本人在最近的一次面试中就被要求手写快排,本来觉得快排的思想早已烂熟于心了,随便写一个出来没什么问题。但是当面前坐着一个面试官,并且要在15分钟内推导出一个无措的快排出来时,对我个人来说,但是还是非常紧张的,最终提交的答案还是存在瑕疵。
由此萌生了通过博客记录面试中基本问题的想法,一是给自己归纳总结,二是希望能够给阅读博客的童鞋也提供一些参考。
本文的目的是想要记录快速排序简洁、优雅的实现方式,并且探讨快速排序的一些问题。并且参考了各类书籍与博客,目前觉得最简洁、最好理解的方式如下:
‘‘‘
void quickSort(int arr[], int lo, int hi){
if(!arr || lo < 0 || lo >= hi) return;
int mid = partition(arr, lo, hi);
quickSort(arr, lo, mid - 1);
quickSort(arr, mid + 1, hi);
}
void partition(int arr[], int lo, int hi){
int start = lo;
int end = hi + 1;
int value = arr[lo];
while(true){
while(arr[++start] < value && start < hi);
while(arr[--end] > value);
if(start >= end) break;
swap(&arr[start], &arr[end]);
}
swap(&arr[lo], &arr[end]);
return end;
}
‘‘‘
主要参考链接https://algs4.cs.princeton.edu/home/
原文地址:https://www.cnblogs.com/migoo/p/8548618.html