当前位置: 首页 > 科技观察

美团专访:请手写快排,我惊呆了!

时间:2023-03-23 11:23:57 科技观察

面试官:我们继续聊数据结构和算法。你能写一个快速排序吗?写在后面)菜鸟我:你什么意思?写在这里?(指着简历)面试官:对,菜鸟我:不知道。面试官:好了,今天的面试就到这里。想在劳资简历上写代码?)沙雕面试官:(回头一头雾水)想想自己还是太年轻了,不然现在不是这样了。随便写吧,反正就是一张纸。其实快速排序说起来容易,很多人可能手写不出来。如果很难,有很多人可以通过多种方式在现场手写。作为一个菜鸟,我还能手写一个类型。毕竟只是在面试前特意准备了“快速打字”而已。接下来我们分析分析——快速排序。背景来自维基百科:Quicksort是1962年由C.A.R.Hoare提出的,其基本思想是:通过one-passsorting将待排序的数据分成两个独立的部分,一个部分中的所有数据小于所有数据另一部分,然后根据该方法对这两部分数据进行快速处理。排序,整个排序过程可以[递归]进行,使整个数据成为一个有序的序列。这个概念很难理解。可以这样理解:快速排序是冒泡排序的改进版。整个过程就是拆和修。核心思想:先从序列中取一个数作为参考数,然后进行大小划分;在划分过程中,将所有大于该数的数放在它的右边,所有小于或等于它的数都放在它的左边;然后对左右区间重复第二步,直到每个区间只有一个数,排序完成。实施案例将以图文形式逐步拆解。以数组[4,1,6,2,9,3]为例。第一遍遍历:首先split[4,1,6,2,9,3]选择元素4作为轴心点检查是否1<4(轴心点)检查是否6<4(轴心点)检查If2<4(pivot)2<4(pivot)为真,将指数2与存储的索引6交换检查是否9<4(pivot)检查3<4(pivot)3<4(pivotpoint)是否为真,将索引3与存储交换index6用存储索引3交换枢轴点4,此时枢轴点4左边小于4,右边大于4,当前数组顺序为[3,1,2,4,9,6].下一步:先向左排序选择元素3作为枢轴检查是否1<3(枢轴)检查是否2<3(枢轴)将枢轴3与存储的指数2交换现在枢轴点已在排序位置[2,1]处拆分选择2作为轴心点,检查是否1<2(轴心点)左边的遍历完成,交换轴心点2和存储索引1。右边是同一个原因...避免视觉疲劳就不一一描述了,大家可以看下面的动态演示图。二、快速排序方法的全过程三、代码实现下面,我们用Java语言实现前面的快速排序案例:importjava.util.Arrays;publicclassQuickSortDemo{//四步://1.比较startIndex和endIndex,更喜欢把它理解为验证//2.找出基准//3。对左侧部分进行排序//4。sorttherightpartition(arr,startIndex,endIndex);//递归分成两边forquickSort(arr,startIndex,partition-1);快速排序(arr,分区+1,endIndex);}}//查找benchmarkprivatestaticintpartition(int[]arr,intstartIndex,intendIndex){intpivot=arr[startIndex];intleft=startIndex;intright=endIndex;//相等,不需要排序while(left!=right){while(leftpivot){right--;}while(left