技术文摘
字节一面之非递归手写快速排序
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;
}
在面试中,清晰地阐述代码的思路和关键步骤,以及对时间复杂度和空间复杂度的分析,能够展现出候选人扎实的算法基础和良好的沟通能力。
熟练掌握非递归手写快速排序对于应对字节跳动等公司的面试至关重要,希望求职者们能够充分准备,在面试中取得优异的成绩。
- 被迫成为中台 身不由己
- 掌握!Python 实现数据预测集成工具制作
- 10 个加速 Python 数据分析的简便技巧
- Python 函数默认返回 None 的原因何在?
- 谷歌推出瞬间压缩九成的神奇图片工具
- 基于数据库和 Redis 开发各系统独立的自增 ID 生成器
- 容器与虚拟化结合:浅析“安全容器”技术发展走向
- 用 100 行 Python 代码完成人体肤色检测
- 13 个 JavaScript 数组优化技巧
- 300 行代码打造“迷你版 GPT” 上线三天获 3.3k 星
- 字节跳动展开反击:TikTok 下周一起诉美国政府
- 疫情未使 70%互联网企业停校招 技术型人才受宠
- Vue Router 4 的若干酷炫功能
- 掌握这些,让您的 Python 文件操作超越 99%的人
- 人类编码是否终结?GPT-3 会让人类下岗吗?未编码过恐怕未必