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

排序算法---快速排序

原创不易,转载请注明出处。欢迎点赞收藏~

快速排序是一种常用的排序算法,采用分治的策略来进行排序。它的基本思想是选取一个元素作为基准(通常是数组中的第一个元素),然后将数组分割成两部分,其中一部分的所有元素小于等于基准值,另一部分的所有元素大于基准值。然后对这两部分继续递归应用快速排序算法,直到整个数组有序。

算法步骤如下:

  1. 选择基准元素。
  2. 将数组分割成两部分,使得左半部分的元素都小于等于基准值,右半部分的元素都大于基准值。
  3. 对左右两部分分别应用快速排序算法(递归)。

快速排序的时间复杂度为O(nlogn)。这是因为每次划分操作会把待排序的序列分割成两个规模大致相等的子序列,划分操作的时间复杂度为O(n),递归调用的次数为O(logn)。所以总体的时间复杂度为O(nlogn)。

快速排序的空间复杂度为O(logn)。这是因为快速排序需要使用递归来进行划分操作,每一层递归都需要额外的空间来保存分割点的位置,递归调用的次数为O(logn),所以总体的空间复杂度为O(logn)。

需要注意的是,快速排序是一种原地排序算法,它不需要额外的辅助空间来进行排序。但是在实际实现中,为了提高排序的效率和减少递归深度,通常会使用一些优化策略,比如随机选择基准元素、三数取中法等。

#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[low]; // 选择第一个元素作为基准值
    int i = low, j = high;

    while (i < j)
    {
        // 从右往左找到第一个小于基准值的元素
        while (i < j && arr[j] >= pivot)
        {
            j--;
        }
        // 从左往右找到第一个大于基准值的元素
        while (i < j && arr[i] <= pivot)
        {
            i++;
        }
        // 交换这两个元素的位置
        if (i < j)
        {
            swap(&arr[i], &arr[j]);
        }
    }

    // 将基准值放到最终的位置
    swap(&arr[low], &arr[i]);

    return i;
}

// 快速排序函数
void quick_sort(int arr[], int low, int high)
{
    if (low < high)
    {
        // 找到分割点
        int pivotIndex = partition(arr, low, high);
        // 对分割点左右两部分进行递归排序
        quick_sort(arr, low, pivotIndex - 1);
        quick_sort(arr, pivotIndex + 1, high);
    }
}

// 测试
int main()
{
    int arr[] = {8, 4, 2, 9, 5, 1, 6, 3, 7};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }

    quick_sort(arr, 0, n - 1);

    printf("\n排序后的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar('\n');

    return 0;
}

以上示例代码演示了如何使用快速排序算法对一个整数数组进行排序。首先定义了交换函数swap用于交换数组中两个元素的位置,然后定义了分割函数partition用于将数组分割成左右两部分。 最后定义了快速排序函数quick_sort来递归地进行分割和排序。

运行示例代码后,你可以看到以下输出:


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

相关文章:

  • 计算机网络 (1)互联网的组成
  • 第四十五章 Vue之Vuex模块化创建(module)
  • Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍
  • 如何进行产线高阶能耗数据的计算和可视化?
  • 探索Python的HTTP利器:Requests库的神秘面纱
  • 贪心算法day03(最长递增序列问题)
  • 如何正确理解和获取S参数
  • 【C语言】案例:输出n位水仙花数
  • 吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用
  • Python爬虫http基本原理#2
  • 使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队
  • 【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
  • 自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler
  • 【原创 附源码】Flutter海外登录--Tiktok登录最详细流程
  • react中的diff算法
  • SAP-PS-001-006问题预算占用与订单实际金额不一致
  • Qt网络编程-TCP与UDP
  • 嵌入式学习Day18 linux高级编程 --- 流的定位
  • 形态学算法应用之连通分量提取的python实现——图像处理
  • Spinnaker多云持续交付平台: 部署Minio存储服务
  • 猜猜谁是凶手?
  • 通过Spring @Validated 更优雅的实现参数校验
  • c++之说_13|模板 折叠表达式
  • 贪心算法的应用
  • 【LangChain-04】利用权重和偏差跟踪和检查LangChain代理的提示
  • Pymysql之Connection中常用API