技术文摘
字节一面之非递归手写快速排序
2024-12-31 00:44:37 小编
字节一面之非递归手写快速排序
在字节跳动的面试中,非递归手写快速排序是一个常见且具有挑战性的考点。快速排序作为一种高效的排序算法,其非递归实现方式能更好地考察候选人对算法原理的深入理解和编程能力。
快速排序的基本思想是通过选择一个基准元素,将待排序的数组划分为两部分,左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素,然后对这两部分分别进行排序,最终实现整个数组的有序排列。
非递归实现快速排序通常借助栈来模拟递归的过程。将整个数组的左右边界压入栈中。然后,在循环中取出栈顶的区间,对其进行划分,并将划分后的子区间压入栈中,直到栈为空。
以下是一个用 C 语言实现的非递归快速排序的示例代码:
#include <stdio.h>
// 交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 划分函数
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 非递归快速排序函数
void quickSortNonRecursive(int arr[], int low, int high) {
int stack[high - low + 1];
int top = -1;
stack[++top] = low;
stack[++top] = high;
while (top >= 0) {
high = stack[top--];
low = stack[top--];
int p = partition(arr, low, high);
if (p - 1 > low) {
stack[++top] = low;
stack[++top] = p - 1;
}
if (p + 1 < high) {
stack[++top] = p + 1;
stack[++top] = high;
}
}
}
// 打印数组函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
// 测试案例
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组为:\n");
printArray(arr, n);
quickSortNonRecursive(arr, 0, n - 1);
printf("排序后的数组为:\n");
printArray(arr, n);
return 0;
}
在面试中,清晰地阐述代码的思路和关键步骤,以及对时间复杂度和空间复杂度的分析,能够展现出候选人扎实的算法基础和良好的沟通能力。
熟练掌握非递归手写快速排序对于应对字节跳动等公司的面试至关重要,希望求职者们能够充分准备,在面试中取得优异的成绩。
- Go1.16 中新函数 Signal.NotifyContext 的使用方法
- 5 月 Github 热门的 JavaScript 开源项目
- Python 仅用三十行代码实现简单人工语音对话
- 5G 时代远程全息呈现成发展方向,AR/VR 硬件迎量变期
- VR 游戏的乱象:伤害频现、暴力横行与恐怖元素对低龄儿童的吸引
- 别用 a.equals(b) 判断对象相等,强烈不建议!
- Vuex 入门必看:先码住这篇笔记!
- 面部识别的利弊:福祸之辨
- 嵌入式开发中输出调试与日志信息的若干方法
- 一日一技:同时结束多个线程的两种办法
- 解析 Golang 语言 Method 接收者的值类型与指针类型
- C# 能否在 PC 上经蓝牙向手机发送数据?
- Python 3.5 带来的便捷矩阵及其他改进
- Axios 进阶封装的项目实践
- Node.js 中 Accept 时 Emfile 的处理策略