C语言之快速排序

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

目录

一 简介

二 代码实现

快速排序基本原理:

C语言实现快速排序的核心函数:

三 时空复杂度

A.时间复杂度

B.空间复杂度

C.总结:


一 简介

快速排序是一种高效的、基于分治策略的比较排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。

二 代码实现

以下是使用C语言实现快速排序的基本步骤和代码示例:

快速排序基本原理:
  • 选择一个基准元素(pivot),通常选择数组的第一个元素或者最后一个元素。
  • 将所有比基准小的元素移动到基准元素之前,所有比基准大的元素移动到基准之后。这个操作被称为分区操作(partition)。
  • 对基准左右两边的子数组分别递归地进行上述操作。
C语言实现快速排序的核心函数:
#include <stdio.h>

// 分区操作,返回基准元素最后的位置
int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // 基准元素(这里选取了数组的最后一个元素)
    int i = (low - 1);  // 指针i初始化为low - 1

    for (int j = low; j <= high - 1; j++) {
        // 如果当前元素小于或等于基准元素,则与指针i所指向位置的元素交换,并将i后移一位
        if (arr[j] <= pivot) {
            i++;
            // 交换arr[i]和arr[j]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    // 把基准元素放到正确的位置(即所有小于它的元素都在它前面)
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;

    return (i + 1);
}

// 快速排序主函数
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // pi是基准元素最后所在的位置
        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);
    
    printf("Sorted array: \n");
    for (int i=0; i<n; i++)
        printf("%d ", arr[i]);
    return 0;
}

这段代码首先定义了一个partition函数,该函数负责对输入数组进行一次划分操作,然后通过quickSort函数递归地对左右两个子数组执行同样的操作,直到子数组只剩下一个元素为止(因为只有一个元素的数组被认为是有序的)。最终,整个数组会被排序完成。

三 时空复杂度

A.时间复杂度
  • 平均情况:当每次划分都能将数组大致均分为两个子数组时,快速排序的平均时间复杂度为 O(nlog_2n)。这是由于每次递归调用都会将问题规模减半,并且需要对 n 个元素进行 log_2n 层递归。

  • 最好情况:最好的情况即每次选取的基准都能将数组完美地划分为大小相等的两部分,此时时间复杂度也是 O(nlog_2n)

  • 最坏情况:最坏的情况是每次划分后,一个子数组为空或只有一个元素,而另一个子数组包含所有剩余元素。例如,对于已经完全有序的数组,这种情况会导致退化为O(n^2)的时间复杂度。然而,在实际应用中,可以通过随机化选择基准元素(如三数取中法)来避免这种极端情况的发生,从而保证快速排序在期望下的时间复杂度仍为O(nlog_2n)

B.空间复杂度
  • 递归栈空间:快速排序是一种递归算法,其递归深度取决于输入数据的结构。在最坏情况下,递归深度可以达到 n,所以空间复杂度为 O(n)。但大多数情况下,递归深度为log_2n,此时的空间复杂度主要来自于递归调用栈,约为 O(log_2n)

  • 辅助空间:快速排序在原地排序的情况下不需要额外的数据存储空间,除了递归调用栈所占用的空间外,算法本身不使用其他额外空间,因此辅助空间复杂度可认为是 O(1)。

C.总结:

综上所述,快速排序在理想情况下是一个非常高效的排序算法,具有较好的平均性能。不过需要注意的是,为了避免最坏情况下的性能下降,通常会采取一些策略优化基准元素的选择方法。

快速排序C语言 快速排序利用了分治法思想,将带排序数组分解成多个部分进行排序,每个部分排序实际是进行一次数组的重新划分,选定一个元素将其作为中间元素,使元素两侧只有大于或是小于他的元素。用递归树可证得快速排序的时间复杂度为nlogn,并且系数较小,是实际中的常用排序算法快速排序C语言int quick_sort(int a[],int p,int q) { int i,j; int max,n; n = ... 阅读详情

相关推荐

怎样在 C 语言实现快速排序

快速排序是一种高效的排序算法,在平均情况下具有出色的性能。通过合理的优化,如随机选择基准元素、在小数组时切换到插入排序和使用三路快速排序,可以进一步提高其在各种情况下的效率。在实际应用中,需要根据数据的特点和性能要求选择合适的排序算法和优化策略。🎉相关推荐📙C 语言百万年薪修炼课程通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。🍅博客首页-关注博主🎗️带你畅游技术世界,不错过每一次成长机会!📙CSDN专栏-C语言修炼📙技术社区-墨松科技📙C 语言百万年薪修炼课程。

2401_86074221的博客 1146

用C语言实现快速排序

这是一个用C语言实现快速排序的程序,它实现了对一个英文文本中的单词排序并将排序结果输出到另外一个文件中。

快速排序——C语言实现

一、排序算法的基本分类: 插入排序类:直接插入排序--------(改进)-------->希尔排序 选择排序类:简单选择排序--------(改进)-------->堆排序 交换排序类:冒泡排序--------(改进)-------->快速排序 二、快速排序算法基本思想: 利用分治法的思想,在序列中任选一个记录作为基准(由自己设定),以此基准将当前无序序列划分为左、右两个较小的...

qq_38236355的博客 795

快速排序的C语言实现算法导论版)

算法导论版的快速排序的完整实现。C语言版。免积分送给需要的朋友。

排序算法快速排序(C语言

快速排序算法是八大排序算法中实用性最高的算法之一,这里详细介绍了快速排序的递归实现和非递归实现,以及单趟排序的多种方法,还有选择key值的三个方法,并附有完整代码和优化后的代码详解,希望能帮助到大家

weixin_52811588的博客 5万+

C语言实现快速排序算法

快速排序算法

qq_58417838的博客 1894

c语言-快速排序

快速排序作为多种排序方法中效率最高的一种,其底层原理被广泛运用,他的核心思想与二叉树结构中的递归逻辑相似,首先标记一个元素作为基准点,然后利用该基准点把数组分成左右两个区间,并且使小于该基准点的元素放在左区间,大于该基准点的元素放在右区间,如此反复递归,直到数组为一个有序数组。

安权_code的博客 2万+

快速排序算法(C语言实现)

快速排序分三大步骤: 1.分:选择一个分割值并将数据按此分为左右两部分 2.治:分别在两部分用递归方式调用上述的分步骤,继续划分 3.合:对分割的部分排序直至完成 #include <stdio.h> #include <stdlib.h> #include <string.h> int partion(char *s,int start,int end) { //随机选取分割值 int key = s[start]; int temp;

木木的博客 4527

[算法]排序——快速排序(QuickSort)多种实现方式(C++实现

快速排序是一种二叉树结构的交换排序算法,其核心思想是选取基准值(key),将序列分割成左小右大的两个子序列,再递归处理直至有序。递归实现主要有三种分区方法:Hoare版本(左右指针相向交换)、挖坑法(填坑式移动)和前后指针法(Lomuto分区)。非递归实现利用栈模拟递归过程,保存待排序区间下标。理想情况下时间复杂度为O(n log n),空间复杂度为O(log n);最坏情况退化为O(n²)。常用优化包括三数取中或随机取数避免最坏情况,以及小区间改用插入排序减少递归深度。

SUICIDEKILL的博客 2万+

快速排序(C语言

中文名:快速排序英文名:quick sort时间复杂度:O(nlog2n)稳定性:不稳定性的排序算法(多个相同的值的相对位置在也许会在算法结束后位置发生改变)原理:将数组的第一个(最后一个)数组元素a,作为关键数据,将比a小的数字b放到a的左边(右边),所有比a小的数字b放到a的右边(左边),快速排序是对冒泡排序的的优化。

m0_64681789的博客 1万+

c语言快速排序

c语言快速排序 原理 含义 快速排序是指通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤 (1)从数列中挑出一个元素,称为“基准”, (2)重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作。 (3)递归地把小于基准值元素

weixin_51446310的博客 1358

快速排序法c语言,C语言实现快速排序算法

一、快速排序算法(Quicksort)1. 定义快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。2. 基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。3. 步骤a. 先从数列中取...

weixin_34469962的博客 872

C语言实现快速排序快速排序的优化和分析

C语言实现快速排序快速排序的优化,超详细讲解看完包会

weixin_62244902的博客 1902

C 语言实现快速排序算法

今天,咱们就一起来深入探讨一下如何用 C 语言实现快速排序算法

2401_87087273的博客 1234

快速排序C语言递归代码实现

快速排序的思路: 假如对数组(arr[])进行排序,那么定义一个基准(datum)并把数组第一个数据赋给datum,定义两个下标(low 和 high)分别记录数组第一个数据下标和数据最后一个数据下标。首先,从数组arr[high]往前遍历,如果arr[high]中的数据比基准datum中的大,那么继续往前遍历(arr[high--])找到第一个数据比基准datum小的位置,并把arr[...

jwhazt的博客 5397

C语言双向链表 快速排序

/******************************************************************** * File Name  : quick_sort.c                                                                 * * Created   : 2007/05/08

Good good study! 1万+

C语言快速排序

java简单学习笔记 C语言对于编程的学习蛮重要的,帮一些同学看程序自己还挺有成就感,但是有时候不熟悉c语言看起来有点吃力。 自己练习一些小的知识,熟悉熟悉c语言 工具使用vsCode,感觉真的好用 快速排序的思想: 选取一个基准,使得大于基准的元素放在右边位置,小于基准的位置放在左边位置,等于基准的元素在中间位置。 选取基准可以选择中间位置,也可以随机一个位置当做基准,也可以将最后一个元素作为基准。该方法适合元素中数据有较多的相同元素。 c语言的函数返回一个数组: 使用指针类型的变量指向静态数组变量 参考

星的博客 472
上一篇: VDI、VPN 与 RDP:选择安全的远程访问解决方案
下一篇: C语言之选择排序
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值