C语言之快速排序算法(递归Hoare版)介绍

C语言之快速排序算法(递归Hoare版)介绍

什么是快速排序算法?

快速排序是一种常见的排序算法,利用分治法思想,将一个大的问题分成若干个子问题,再递归解决每一个子问题,最终将这些子问题的解组合成原问题的解。它的基本思想是先通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的数据都比另外一部分的数据小,再对这两部分数据分别进行快速排序,最终完成整个数据的排序。

快速排序算法的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法,不需要额外的存储空间。

怎样实现快速排序?

快速排序算法可以实现多种方法,递归楼分区是其中最常用的方法之一。其中Hoare partition是一种最常见的分区技术。分区技术是将数组分成两个部分,第一个部分是比某个值小的元素所组成的子数组,第二个子数组是比这个值大的元素组成的子数组。

递归过程中,将数组中的最左边元素作为枢轴元素,利用分治思想,将数组以枢轴元素为基准分成两个部分,对这两个部分分别递归调用,最终完成排序。

下面是C语言递归Hoare版快速排序算法的代码样例:

int partition(int *nums, int left, int right) {
    int pivot = nums[left];
    int i = left, j = right;
    while (i <= j) {
        while (nums[i] < pivot) {
            i++;
        }
        while (nums[j] > pivot) {
            j--;
        }
        if (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
    return j;
}

void quicksort(int *nums, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot_index = partition(nums, left, right);
    quicksort(nums, left, pivot_index);
    quicksort(nums, pivot_index+1, right);
}

示例

示例一

#include <stdio.h>

int main() {
    int nums[] = {8, 3, 10, 5, 1, 2, 9, 7, 6, 4};
    int len = sizeof(nums) / sizeof(nums[0]);

    quicksort(nums, 0, len-1);

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

输出结果为:1 2 3 4 5 6 7 8 9 10

示例二

#include <stdio.h>

int main() {
    int nums[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int len = sizeof(nums) / sizeof(nums[0]);

    quicksort(nums, 0, len-1);

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

输出结果为:0 0 0 0 0 0 0 0 0 0

以上两个示例都展现了递归Hoare版快速排序算法的功能,可以对数组进行排序。

最后再次总结快速排序算法的时间复杂度和优点:时间复杂度为 $O(nlogn)$,比其他算法要快;是一种原地排序算法,不需要额外存储空间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言之快速排序算法(递归Hoare版)介绍 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • SQL SERVER的字段类型说明

    下面是SQL SERVER的字段类型说明的完整攻略。 SQL SERVER的字段类型 在SQL SERVER中,每个表都包含一个或多个字段,每个字段都有其数据类型或数据格式。数据类型指定数据的存储方式和可操作范围。以下是SQL SERVER中可用的主要数据类型。 数据类型 描述 int 整数 float 浮点数 char 固定长度的字符 varchar 可变…

    other 2023年6月25日
    00
  • win11管理员账户名称怎么改 快速更改管理员账户名称的两种方法

    当我们在Windows 11系统下使用管理员账户时,可能会因为一些原因需要修改管理员账户名称,下面将介绍两种快速更改管理员账户名称的方法。 方法1:使用控制面板更改管理员账户名称 使用管理员账户登录系统。 按下Win+R键,打开运行对话框。 输入“control”并按下回车键,打开控制面板。 选择“用户账户”。 点击“更改你的账户类型”。 点击管理员账户,然…

    other 2023年6月27日
    00
  • 详解Java 中的嵌套类与内部类

    ” + outerData); } }} 在上面的示例中,`InnerClass`是一个非静态内部类,它可以访问外部类`OuterClass`的静态和非静态成员`outerData`。可以通过以下方式使用非静态内部类: “`java OuterClass outerObject = new OuterClass(); OuterClass.InnerCla…

    other 2023年7月27日
    00
  • windows server 2012安装FTP并配置被动模式指定开放端口

    请先确保你的Windows Server 2012已经安装好了IIS。 安装FTP 步骤1:打开服务器管理器 登录到Windows Server 2012,点击桌面左下角开始菜单,从中找到“Server Manager”并单击进入。 步骤2:添加FTP服务器角色 在“Server Manager”窗口中,选择左侧菜单栏中的“Roles”文件夹,然后在右侧窗口…

    other 2023年6月27日
    00
  • 你需要知道的10个最佳javascript开发实践小结

    你需要知道的10个最佳JavaScript开发实践小结 在JavaScript开发中,遵循最佳实践可以提高代码的可读性、可维护性和性能。以下是10个最佳JavaScript开发实践的详细攻略: 1. 使用严格模式 在JavaScript文件或函数的开头使用严格模式,可以帮助你避免一些常见的错误,并使代码更加规范。严格模式可以通过在文件或函数的开头添加\”us…

    other 2023年7月27日
    00
  • Win2003里用命令行刷新硬件列表,以扫描硬件改动的实现代码

    要在Windows Server 2003中使用命令行刷新硬件列表的话,需要使用Diskpart和Devcon两个工具。具体的步骤可以分为以下几个: 1. 使用Diskpart命令执行rescan操作 在命令提示符窗口中,输入以下命令: diskpart rescan exit 其中,diskpart命令会打开Diskpart工具,rescan命令会扫描硬件…

    other 2023年6月26日
    00
  • Windows cmd命令行输入输出重定向问题

    针对“Windows cmd命令行输入输出重定向问题”,我给出以下完整攻略。 什么是输入输出重定向? 命令行输入输出重定向是指,在执行命令时,可以将命令中的输入输出流重定向到指定的文件或设备上,使得命令可以从文件或设备中输入数据,将输出结果保存在文件或设备中,而不是向屏幕输出。 在Windows命令行中,可以通过符号来实现输入输出重定向: 输入重定向符号:“…

    other 2023年6月26日
    00
  • 在fedora22下安装配置realvncserver5.2.3的经验总结

    以下是关于“在Fedora22下安装配置RealVNC Server 5.2.3的经验总结”的完整攻略,包括RealVNC Server的介绍、在Fedora22安装配置RealVNC 5.2.3的方法示例说明和注意事项。 RealVNC Server的介绍 RealVNC Server是一款远程控制软,可以让用户通过网络远程控制其他计算机。RealVNC …

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部