字节一面之非递归手写快速排序

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;
}

在面试中,清晰地阐述代码的思路和关键步骤,以及对时间复杂度和空间复杂度的分析,能够展现出候选人扎实的算法基础和良好的沟通能力。

熟练掌握非递归手写快速排序对于应对字节跳动等公司的面试至关重要,希望求职者们能够充分准备,在面试中取得优异的成绩。

TAGS: 字节一面 快速排序 非递归 手写快速排序

欢迎使用万千站长工具!

Welcome to www.zzTool.com