快速排序 代码+注释(C语言)

博客主要提及了快速排序。快速排序是一种重要的排序算法,在信息技术领域常用于数据的排序处理,与算法和数据结构密切相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

#include <stdio.h>

// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 将数组分为两部分,小于基准的在左边,大于基准的在右边
int partition(int arr[], int left, int right) {
    int base = arr[left]; // 选择最左边的元素作为基准

    while (left < right) {
        // 从右往左找到第一个比基准小的元素
        while (left < right && arr[right] > base) {
            right--;
        }

        if (left < right) {
            arr[left] = arr[right]; // 将找到的小于基准的元素放到左边
            left++;
        }

        // 从左往右找到第一个比基准大的元素
        while (left < right && arr[left] < base) {
            left++;
        }

        if (left < right) {
            arr[right] = arr[left]; // 将找到的大于基准的元素放到右边
            right--;
        }
    }

    arr[left] = base; // 将基准元素放置到正确的位置上

    return left; // 返回基准元素的索引
}

// 快速排序算法
void quickSort(int arr[], int left, int right) {
    if (left < right) {
        int index = partition(arr, left, right); // 获取基准元素的索引

        // 对基准元素左边的子数组进行递归排序
        quickSort(arr, left, index - 1);

        // 对基准元素右边的子数组进行递归排序
        quickSort(arr, index + 1, right);
    }
}

int main() {
    int arr[] = { 54, 26, 93, 17, 77, 31, 44, 55, 20 };
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原数组:\n");
    printArray(arr, n);

    // 调用快速排序函数
    quickSort(arr, 0, n - 1);

    printf("排序后数组:\n");
    printArray(arr, n);

    return 0;
}
<think>好的,我现在需要帮助用户找到快速排序算法的C语言完整实现代码。首先,我得回顾一下用户的问题。用户明确要求完整的C语言代码示例,并且提到了参考了站内的引用,其中引用1、2、4都与快速排序相关,而引用3是关于归并排序的,可能不太相关,但需要确认。 首先,我应该检查用户提供的引用内容。引用[1]提到快速排序的分治法策略,并可能有代码示例,但用户示例中的Python代码可能不是他们需要的。引用[2]和引用[4]都提到了C语言的实现,特别是引用[4]还提到了处理文件输入的情况。这可能对用户有用,尤其是如果他们需要从文件读取数据的话。 用户的需求是完整的代码示例,所以需要确保提供的代码包括主函数、分区函数和快速排序函数。根据标准的快速排序实现,通常会有三个部分:swap交换函数、partition分区函数和quickSort递归函数。此外,主函数需要处理输入输出,可能包括从文件读取数据,如引用[4]提到的input.txt文件。 接下来,我需要确保代码符合C语言的语法规范,比如正确的函数声明、指针的使用,以及递归调用是否正确。例如,partition函数通常选择最后一个元素作为基准,然后进行分区,将小于基准的放在左边,大于的放在右边,最后返回基准的正确位置。 另外,用户提供的引用中,引用[2]提到快速排序的时间复杂度是O(n log n),并且是原地排序,但不稳定。这些信息可能在代码注释或解释中有用,但用户主要需要代码。 现在,我需要整合这些信息,写出一个完整的C程序,包括从文件读取输入(如引用[4]所述),处理多个测试用例,直到遇到-1为止。每个测试用例的第一行是元素个数m,第二行是m个整数。代码需要读取这些数据,进行排序,并输出结果。 同时,需要考虑代码的可读性,比如添加适当的注释,说明每个部分的功能。例如,在partition函数中解释如何选择基准,并如何进行元素交换。在quickSort函数中,递归调用的条件是否正确(low < high)。 还需要处理文件操作,使用fopen读取input.txt,使用fscanf读取数据,直到遇到-1。对于每个测试用例,动态分配内存存储元素,排序后输出,并释放内存以防止泄漏。 可能遇到的错误点包括文件打开失败、内存分配失败,这些情况在代码中应该处理,比如添加错误提示。但根据用户的要求,可能不需要过于复杂的错误处理,保持代码简洁。 最后,确保代码示例正确,并且能够编译运行。例如,使用标准库函数stdio.h和stdlib.h,正确的函数参数传递,以及递归的正确使用。 总结步骤: 1. 引入必要的头文件(stdio.h, stdlib.h)。 2. 实现swap函数交换两个整数。 3. 实现partition函数,选择基准并进行分区。 4. 实现quickSort递归函数。 5. 主函数中处理文件输入,读取测试用例,调用排序函数,输出结果。 6. 添加注释说明关键部分。 现在,将这些步骤转化为代码,并确保符合用户的要求。同时,引用相关的参考资料,如引用[1]和[4],以支持代码的正确性。</think>以下是快速排序算法的完整C语言实现代码示例,包含文件输入输出和动态内存分配: ```c #include <stdio.h> #include <stdlib.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() { FILE *file = fopen("input.txt", "r"); if (file == NULL) { printf("无法打开文件!\n"); return 1; } while (1) { int m; fscanf(file, "%d", &m); if (m == -1) break; // 文件结束标记 int *arr = (int*)malloc(m * sizeof(int)); for (int i = 0; i < m; i++) { fscanf(file, "%d", &arr[i]); } quickSort(arr, 0, m-1); printf("排序结果:"); for (int i = 0; i < m; i++) { printf("%d ", arr[i]); } printf("\n"); free(arr); } fclose(file); return 0; } ``` 该实现包含以下特性[^1][^4]: 1. 支持从文本文件读取测试数据(格式符合引用[4]要求) 2. 使用经典的分治策略(Divide and Conquer) 3. 原地排序(空间复杂度O(1)) 4. 平均时间复杂度O(n log n)[^2] 5. 包含完整的内存管理(动态内存分配与释放)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值