【C语言】快速排序模板

模板

用两个指针i、j,确定好x,再令小于x的放在x左边,大于x的放在x的右边,通过do..while来实现,让l指针向后移动,直到遇见大于x的值,让r指针向前移动,直到遇见小于x的值(因为边界问题,i要等于l-1,j要等于r+1)此时,交换i、j指向的元素,从而实现把小于x的放在x左边,大于x的放在x的右边,又因为这一行为需要重复做,所以放在while里面,循环条件是i<j。

后面使用递归来分别排序x的左边、x的右边。

#include<stdio.h>

void quick_sort(int* arr, int l, int r)
{
    if (l >= r)
    {
        return;
    }
    else
    {
        int i = l - 1;
        int j = r + 1;
        int x = arr[(l + r) / 2];
        while (i < j)
        {
            do
            {
                i++;
            } while (arr[i] < x);

            do
            {
                j--;
            } while (arr[j] > x);

            if (i < j)
            {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
        quick_sort(arr, l, j);
        quick_sort(arr, j + 1, r);
    }
}
int main()
{
    int n = 0;
    int arr[100000] = { 0 };
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }

    quick_sort(arr, 0, n - 1);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

<think>嗯,用户想要找C语言实现的快速排序算法模板。首先,我需要回忆一下快速排序的基本原理和步骤。快速排序是分治算法,通过选择一个基准元素,将数组分成两部分,一部分比基准小,另一部分比基准大,然后递归地对这两部分排序。 接下来,我得考虑如何在C语言中实现这个算法。通常需要两个函数:一个负责递归分治,另一个负责划分数组。划分函数是关键,它选择基准元素并将数组重新排列。常见的基准选择方法是取第一个元素、中间元素或者随机元素,这里可能需要提到不同的选择策略对性能的影响,比如避免最坏时间复杂度O(n²)的情况。 然后,编写代码结构。主函数可能是quicksort,参数包括数组指针、起始和结束索引。划分函数partition需要返回基准元素的最终位置。递归结束的条件是子数组长度小于等于1,这时候直接返回。 还要注意边界条件和数组索引的处理,避免越界错误。比如,在循环中移动左右指针时,要确保不超出数组范围。交换元素的时候,使用临时变量或者位操作来实现。 用户可能还关心如何测试这个模板,所以可能需要提供一个示例main函数,展示如何使用这个快速排序函数。此外,可能需要提到优化方法,比如小数组时切换到插入排序,或者随机选择基准元素来提高性能。 然后,根据用户提供的引用,引用[1]提到C++的std::sort是多种排序算法的混合,可能说明实际应用中快速排序可能会有不同的优化策略,但用户需要的是基础的C语言模板,所以保持代码简洁,突出核心逻辑。 最后,生成相关问题时要考虑用户可能的后续疑问,比如性能分析、优化方法、应用场景,以及与其他排序算法的比较。这样能够帮助用户更全面地理解快速排序。</think>### C语言快速排序算法模板实现 快速排序的核心是通过基准元素划分数组,递归执行分治策略。以下是标准实现模板: ```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 quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 示例调用 int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr)/sizeof(arr[0]); quickSort(arr, 0, n-1); for (int i=0; i<n; i++) printf("%d ", arr[i]); return 0; } ``` #### 关键特性说明 1. **基准选择优化**:示例使用最后一个元素作为基准,实际可改为三数取中法或随机选择来避免最坏情况$O(n^2)$时间复杂度[^1] 2. **空间复杂度**:$O(\log n)$的栈空间(最优递归深度) 3. **稳定性**:非稳定排序,交换操作可能改变相同元素顺序
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值