面试手撕快速排序(直接翻车)

2022.3.24阿里电话面试,销售管理部-机器学习岗,上来让写三道SQL和快排的实现,现场翻车。。。
查漏补缺,快排的原理,使用双指针,初始分别指向左右边界。首先找一个基准数,以第一个为例(用一个变量如pivot保存),每次在把右侧第一个比自身小的数与其左侧第一个比自身大的数进行交换,最终当双指针相遇时,该位置就是基准数的排序后的正确位置,将基准数赋给该位置。之后对其左右侧各执行上述操作,知道最终整个数组有序。

  1. 当右指针指向的数大于基准数且左右指针没相遇(相遇转向3)时左移,否则就找到了该基准数右侧第一个比自身小的数字,把这个数字赋给左指针指向的数。此时右指针不动转向2
  2. 当左指针指向的数小于基准数且左右指针没相遇(相遇转向3)时右移,否则就找到了该基准数左侧第一个比自身大的数字,把这个数字赋给右指针指向的数。此时左指针不动转向1
  3. 当左右指针相遇时终止,并把基准数赋给指向的位置

下面是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右部分进行递归
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值