2022.3.24阿里电话面试,销售管理部-机器学习岗,上来让写三道SQL和快排的实现,现场翻车。。。
查漏补缺,快排的原理,使用双指针,初始分别指向左右边界。首先找一个基准数,以第一个为例(用一个变量如pivot保存),每次在把右侧第一个比自身小的数与其左侧第一个比自身大的数进行交换,最终当双指针相遇时,该位置就是基准数的排序后的正确位置,将基准数赋给该位置。之后对其左右侧各执行上述操作,知道最终整个数组有序。
- 当右指针指向的数大于基准数且左右指针没相遇(相遇转向3)时左移,否则就找到了该基准数右侧第一个比自身小的数字,把这个数字赋给左指针指向的数。此时右指针不动转向2
- 当左指针指向的数小于基准数且左右指针没相遇(相遇转向3)时右移,否则就找到了该基准数左侧第一个比自身大的数字,把这个数字赋给右指针指向的数。此时左指针不动转向1
- 当左右指针相遇时终止,并把基准数赋给指向的位置
下面是C++实现,参考(照搬)了严蔚敏版《数据结构》中的快排实现。
#include<iostream>
using namespace std;
int getindex(int A[], int left, int right); //找到基准数对应的排序后的正确下标
void QuickSort(int A[], int left, int right);//调用getindex找到基准数位置,对左右部分分别递归调用自身,直到整个数组有序
int main(){
//测试数据
int A[10] = {14,35,7,39,13,65,42,19,27,58};
//调用快排
QuickSort(A, 0, 9);
//输出排序后的结果
for(int i = 0;i<10;i++) {
cout<<A[i]<<endl;
}
return 0;
}
int getindex(int A[], int left, int right) {
int pivot = A[left];
while (left < right) {
while (left< right&& A[right] >= pivot) {
--right;
}
A[left] = A[right];
while (left< right&& A[left] <= pivot) {
++left;
}
A[right] = A[left];
}
A[left] = pivot;
return left;
}
void QuickSort(int A[], int left, int right)
{
if (left< right) {
int pivot = getindex(A, left, right);
QuickSort(A, left, pivot - 1); //对pivot左部分进行递归
QuickSort(A, pivot + 1, right);//对pivot右部分进行递归
}
}