当前位置: 首页 > article >正文

C语言中的快速排序

我将详细解释快速排序算法的工作原理以及上述C语言代码的实现过程。
快速排序是一种高效的排序算法,它采用分治策略(Divide and Conquer)来对一个序列进行排序。快速排序的基本思想是选择一个元素作为"基准"(pivot),通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 

c
#include <stdio.h>

void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // pivot
    int i = (low - 1); // Index of smaller element

    for (int j = low; j <= high - 1; j++) {
        // If current element is smaller than the pivot
        if (arr[j] < pivot) {
            i++; // increment index of smaller element
            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) {
        /* pi is partitioning index, arr[p] is now
           at right place */
        int pi = partition(arr, low, high);

        // Separately sort elements before
        // partition and after partition
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

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

int main() {
    int n;
    printf("Enter number of elements in the array:\n");
    scanf("%d", &n);
    
    int arr[n]; // Create an array with given number of elements
    printf("Enter %d integers:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    quickSort(arr, 0, n - 1);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}

以下是快速排序的步骤:

1. 选择基准:在数据集之中,选择一个元素作为"基准"(pivot)。

2. 分区操作:将数组进行分区(partition),将小于基准的元素移到基准的左边,将大于基准的元素移到基准的右边。分区完成后,基准元素所处的位置就是最终排序后它的位置。

3. 递归排序:递归地将小于基准的元素的子序列和大于基准的元素的子序列排序。

4. 合并:因为子序列的排序是就地进行的,所以不需要合并操作,整个数组就变成了有序的。

 C语言代码实现解释

1. swap函数:swap函数接受两个整型指针作为参数,用于交换两个变量的值。

void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

2. partition函数:partition函数执行分区操作,它选择数组的最后一个元素作为基准,然后重新排列数组,使得所有小于基准的元素都位于基准的左边,所有大于基准的元素都位于基准的右边。函数返回基准元素最终所在位置的索引。

int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // pivot
    int i = (low - 1); // Index of smaller element

    for (int j = low; j <= high - 1; j++) {
        // If current element is smaller than the pivot
        if (arr[j] < pivot) {
            i++; // increment index of smaller element
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

3. quickSort函数:quickSort函数是递归函数,它使用partition函数来找到基准的正确位置,并递归地对基准左右两边的子数组进行排序。

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

4. printArray函数:printArray函数用于打印数组中的所有元素。

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

5. main函数:main函数是程序的入口点,它负责接收用户输入的数组大小和数组元素,调用quickSort函数对数组进行排序,并最后调用printArray函数打印排序后的数组。

int main() {
    int n;
    printf("Enter number of elements in the array:\n");
    scanf("%d", &n);
    
    int arr[n]; // Create an array with given number of elements
    printf("Enter %d integers:\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    quickSort(arr, 0, n - 1);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}
 

 

 

 

 

 

 


http://www.kler.cn/a/378234.html

相关文章:

  • 【UART异步串口协议及verilog实现】
  • DCRNN解读(论文+代码)
  • windows XP,ReactOS系统3.4 共享映射区(Section)---2
  • PHP常量
  • WordPress之generatepress主题安装
  • 根据某个字段禁用el-table里的checkbox
  • DNA、蛋白质、生物语义语言模型的介绍
  • ARM cpu算力KDMIPS测试
  • 用 Ray 扩展 AI 应用
  • Django+Vue全栈开发旅游网项目景点详情
  • Linux系统-僵尸孤儿进程
  • Android平台RTSP转RTMP推送之采集麦克风音频转发
  • 【C++】多态的语法与底层原理
  • MATLAB算法实战应用案例精讲-【数模应用】PageRank(附MATLAB、C++、python和R语言代码实现)
  • 《Java 实现快速排序:原理剖析与代码详解》
  • thinkphp中命令行工具think使用,可用于快速生成控制器,模型,中间件等
  • 智源推出小时级超长视频理解大模型Video-XL
  • MVC(Model-View-Controller)模式概述
  • 【WPF】深入理解并发、并行、单线程、多线程、同步、异步概念
  • __attribute__ ((__packed__))
  • 计算机网络:网络层 —— 路由信息协议 RIP
  • 智驭模板引擎管理系统(SmartTemplate Manager)
  • k8s环境下rabbitmq安装社区插件:rabbitmq_delayed_message_exchange
  • 施耐德EcoStruxure Machine SCADA Expert(EMSE)ModbusTcp通讯(二十二)
  • Linux系统安全配置
  • Javaweb梳理8——数据库设计