服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言之快速排序算法(递归Hoare版)介绍

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

2022-07-19 10:16绅士·永 C/C++

大家好,本篇文章主要讲的是C语言之快速排序算法(递归Hoare版)介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

废话不多说,先看代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#define  _CRT_SECURE_NO_WARNINGS 1
//快速排序算法,递归求解
#include <stdio.h>
void swap(int* a, int* b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}
void Compare(int arr[], int one, int end)
{
    int first = one;//最左边数组下标
    int last = end;//最右边数组下标
    int key = first;//用于比较的标量(选取最左边第一个元素)
    if (first >= last)
    {
        return;
    }
    while (first < last)
    {
        while (first < last && arr[last] >= arr[key])//右边找比标量小的数
        {
            last--;
        }
        while (first < last && arr[first] <= arr[key])//左边找比标量大的数
        {
            first++;
        }
        if(first < last)//分析交换找出来的值
        swap(&arr[first], &arr[last]);
    }
    if (first == last)
    {
        int mite = key;//交换标量到它应该到的位置上,重新选取标量
        swap(&arr[mite], &arr[last]);
    }
    Compare(arr,one,first-1);//左边递归排序
    Compare(arr,first+1,end);//右边递归排序
}
int main()
{
    int arr[] = { 5,4,6,5,2,1};
    int i = 0;
    int len = sizeof(arr) / 4;
    Compare(arr,i,len-1);//传第一个和最后一个元素的下标
    for (i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

首先什么是快速排序算法:快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n 个项目要Ο(nlogn) 次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)

简单的说,选取一个基准(这里选取第一个数据),与其他数据进行比较,使比它小的在它的前面,比它大的在它的后面。然后再以这个基准为界限分为两部地方(比它大的部分、比它小的部分),分别选取两个部分的基准,再进行比较,比较完后在进行分界,重复下去,直到最后每部分都只有一个数据时,排序结束。

图解-->

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

代码讲解:<运用递归>

1、首先需要创建数组、数组第一个数据下标,最后一个数据下标三个参数,数组用于储存数据,然后创建一个Compare()用于快速排序函数,最后打印出来就是我们需要的有序数列。

?
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int arr[] = { 5,4,6,5,2,1};
    int i = 0;
    int len = sizeof(arr) / 4;
    Compare(arr,i,len-1);//传第一个和最后一个元素的下标
    for (i = 0; i < len; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;

2、Compare()函数创建

这里使用无符号返回类型,因为不需要返回值

为保证数组第一个元素和最后一个元素下标不变,创建first和last两个局部变量记录数组第一个元素和最后一个元素的下标

创建key下标的数据作为基准

?
1
2
3
4
5
void Compare(int arr[], int one, int end)
{
    int first = one;//最左边数组下标
    int last = end;//最右边数组下标
    int key = first;//用于比较的标量(选取最左边第一个元素)

3、首先判断数列是否只有一个元素,如果只有一个元素,则函数结束。

4、开始实现函数主要比较部分

4.1、如果选取左边第一个数据为基准,先从右边开始比较,

4.2、从右边第一个数据开始与key进行比较,如果比它大则继续向右比较(last--),直到找到比key小的数据,便停下来。

4.3、此刻开始从左边开始与key比较,如果比key小则继续比较(first++),如果比key大则与右边找到的比key大的数进行交换。然后右边继续找,重复以上步骤。

4.4、直到first>=last时,都停止寻找,并交换此时first下标的数据与key的值

4.5、分治思想,以此时的key下标的数组作为分界,分为比它大的、比它小的两部分,在重复以上步骤,直至只有一个数据为止,停下排序。采用递归求解。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Compare(int arr[], int one, int end)
{
    int first = one;//最左边数组下标
    int last = end;//最右边数组下标
    int key = first;//用于比较的标量(选取最左边第一个元素)
    if (first >= last)
    {
        return;
    }
    while (first < last)
    {
        while (first < last && arr[last] >= arr[key])//右边找比标量小的数
        {
            last--;
        }
        while (first < last && arr[first] <= arr[key])//左边找比标量大的数
        {
            first++;
        }
        if(first < last)//分析交换找出来的值
        swap(&arr[first], &arr[last]);
    }
    if (first == last)
    {
        int mite = key;//交换标量到它应该到的位置上,重新选取标量
        swap(&arr[mite], &arr[last]);
    }
    Compare(arr,one,first-1);//左边递归排序
    Compare(arr,first+1,end);//右边递归排序
}

swap()交换函数,因为需要影响到交换函数外的值,使用指针形参。

?
1
2
3
4
5
6
7
void swap(int* a, int* b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}

到此这篇关于C语言之快速排序算法(递归Hoare版)介绍的文章就介绍到这了,更多相关C语言快速排序算法内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_63246064/article/details/122013437

延伸 · 阅读

精彩推荐
  • C/C++C++利用容器查找重复列功能实现

    C++利用容器查找重复列功能实现

    本文将详细介绍c++容器简介,c++容器的比较 与操作实例,需要了解更多的朋友可以参考下...

    C++教程网1802020-11-12
  • C/C++C++ 使用PrintWindow实现窗口截图功能

    C++ 使用PrintWindow实现窗口截图功能

    这篇文章主要介绍了C++ 如何使用PrintWindow实现窗口截图功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    xhubobo8532021-09-18
  • C/C++C++实现对象化的矩阵相乘小程序

    C++实现对象化的矩阵相乘小程序

    这篇文章主要为大家详细介绍了C++实现对象化的矩阵相乘小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    超自然祈祷4652022-01-07
  • C/C++C语言实现简单三子棋程序

    C语言实现简单三子棋程序

    这篇文章主要为大家详细介绍了C语言实现简单三子棋程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    木头i7852021-06-24
  • C/C++C++实现LeetCode(102.二叉树层序遍历)

    C++实现LeetCode(102.二叉树层序遍历)

    这篇文章主要介绍了C++实现LeetCode(102.二叉树层序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang7332021-12-01
  • C/C++C语言基础隐式类型转换与强制类型转换示例解析

    C语言基础隐式类型转换与强制类型转换示例解析

    最接地气的有关类型转换的介绍,此处对于类型转换的相关知识点做一些简要的介绍,作者实属初学,难免文章中有内容理解不到位或者有不当之处,还请...

    RookieStriver3402022-02-27
  • C/C++C++ stack与queue模拟实现详解

    C++ stack与queue模拟实现详解

    这篇文章主要给大家介绍了关于c++stack与queue模拟实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    可乐不解渴5762021-12-24
  • C/C++教你Clion调试ROS包的方法

    教你Clion调试ROS包的方法

    Clion是一款专门开发C以及C++所设计的跨平台的IDE,本文给大家介绍Clion调试ROS包的方法,感兴趣的朋友跟随小编一起看看吧...

    horsetail8352021-11-24