C/C++实现快速排序(两种方式)图文详解

C/C++实现快速排序(两种方式)图文详解

什么是快速排序

快速排序是一种基于分治策略的排序算法,由C.A.R.Hoare在1962年发明。快速排序的基本思路是:在待排序序列中选择一个元素作为“基准”(pivot),将序列分成两个部分,所有比“基准”小的元素放在一边,所有比“基准”大的元素放在另一边。如此递归下去直到序列有序。

算法流程

快速排序的流程可以简要描述为:

  1. 从待排序数组中选择一个基准元素(通常选择第一个元素)。

  2. 将所有小于基准元素的元素放在左边,所有大于基准元素的元素放在右边。

  3. 对于左右两个子数组递归执行步骤1、2,直到所有子数组有序。

代码实现

实现思路

快速排序的实现思路主要有以下两种:

  • 首先采用简单的实现方法,对基准元素左右两边的序列应用递归完成排序。针对这种实现方法,我们采用C++编程语言实现。其代码如下:
    void quicksort(int arr[], int left, int right)
    {
        if(left > right)
            return;
        int i = left, j = right, pivot = arr[left];
        while(i < j)
        {
            while(i < j && arr[j] >= pivot)
                j--;
            if(i < j)
                arr[i++] = arr[j];
            while(i < j && arr[i] < pivot)
                i++;
            if(i < j)
                arr[j--] = arr[i];
        }
        arr[i] = pivot;
        quicksort(arr, left, i - 1);
        quicksort(arr, i + 1, right);
    }
  • 另外一种方法是采用C语言的实现方式。该实现方式相对于第一种方法非常基础并且难点也不大。其代码如下:
    void QuickSort(int *a, int left, int right)
    {
        if (left >= right) return;
        int i = left, j = right, pivot = a[left];
        while (i < j) {
            while (i < j && a[j] >= pivot) --j; 
            a[i] = a[j];
            while (i < j && a[i] <= pivot) ++i;
            a[j] = a[i];
        }
        a[i] = pivot;
        QuickSort(a, left, i - 1);
        QuickSort(a, i + 1, right);
    }

示例说明

我们来看下两组基础的使用示例。

示例一:

    int main()
    {
        int arr[] = {10, 7, 8, 9, 1, 5};
        int n = sizeof(arr)/sizeof(arr[0]);
        quicksort(arr, 0, n - 1);
        for(int i = 0; i < n; i++)
            cout << arr[i] << " ";
        return 0; 
    }

运行结果:

1 5 7 8 9 10

示例二(采用第二种代码实现方式):

    #include <stdio.h>
    int main()
    {
        int arr[] = {10, 7, 8, 9, 1, 5};
        int n = sizeof(arr)/sizeof(arr[0]);
        QuickSort(arr, 0, n - 1);
        for(int i = 0; i < n; i++)
            printf("%d ", arr[i]);
        return 0; 
    }

运行结果:

1 5 7 8 9 10

总结

快速排序是一种非常高效、经典的排序算法,并且有着广泛的应用场景。快速排序算法核心思路非常简单,代码实现也相对较为简单。当然在实践过程中还涉及到很多的优化技巧,例如三数取中等,都可以很大程度上提升算法效率,欢迎大家自行实践。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++实现快速排序(两种方式)图文详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 关于Python排序问题(冒泡/选择/插入)

    关于Python排序问题,一般包括冒泡排序、选择排序和插入排序。下面分别进行介绍。 冒泡排序 冒泡排序就是重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复地进行以上操作,直到没有可以交换的元素为止。 示例代码: def bubble_sort(arr): n = len(arr) for i in range(n-1): …

    算法与数据结构 2023年5月19日
    00
  • 超详细解析C++实现快速排序算法的方法

    超详细解析C++实现快速排序算法的方法 什么是快速排序? 快速排序是一种高效的排序算法。因为采用了分治法的思想,利用递归实现,每次排序只需比较部分元素,而不需要像冒泡排序和插入排序那样需要从头到尾对比每个元素,因此效率非常高。 快速排序算法的基本思想 快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,使得前面的记录的关键字均小于后面的记录的关键…

    算法与数据结构 2023年5月19日
    00
  • Java实现单向链表的基本功能详解

    Java实现单向链表的基本功能详解 单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含存储数据的元素和一个指向下一个节点的指针。Java语言可以很方便地实现单向链表,本文将详细介绍Java实现单向链表的基本功能。 一、定义链表节点类 链表的基本单元是节点,我们需要定义一个节点类来描述它。节点类需要包含两个部分:存储数据的元素和指向下一个节点的指针…

    算法与数据结构 2023年5月19日
    00
  • C++实现位图排序实例

    C++实现位图排序实例攻略 什么是位图排序 位图排序是一种空间换时间的算法,主要针对大量重复性数据的排序问题。其主要思想是将待排序的数据作为位图的索引,将出现的数据标识为1,最后按照位图的索引顺序输出结果。 如何实现位图排序 具体实现步骤如下: 确定位图最大数据值及位图长度。假设需要排序的数据范围是[1,10000],对应的位图长度为(10000/8)+1=…

    算法与数据结构 2023年5月19日
    00
  • C语言超详细讲解排序算法上篇

    C语言超详细讲解排序算法上篇 简介 本文将介绍排序算法的基础知识和常见排序算法,包括冒泡排序、选择排序、插入排序。 排序算法是计算机科学中非常重要的算法之一,在实际开发中也经常用到。了解各种排序算法的特点和优缺点,可以帮助我们更好地应对实际问题。 基础知识 在介绍排序算法之前,有一些基础知识需要了解。 1. 时间复杂度 时间复杂度用来衡量一个算法所需要的计算…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

    算法与数据结构 2023年5月19日
    00
  • 解析左右值无限分类的实现算法

    下面为你详细讲解“解析左右值无限分类的实现算法”的完整攻略: 1. 了解左右值无限分类 左右值无限分类,也称为嵌套集合模型,是一种常见的无限分类方式。在该模型中,每个分类都有一个左值和右值,通过比较左右值大小,可以判断出一个分类是否是另一个分类的子分类或者父分类。支持多层级分类,可以无限嵌套。 2. 左右值无限分类的实现算法 左右值无限分类的实现算法分为两步…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组按升序及降序排列的方法

    JS实现数组按升序和降序排列的方法有很多种,下面我将从简单到复杂分享几种方法。 sort()方法 sort()方法是JS的一个数组方法,可以对数组排序。它有一个可选的排序函数,用于规定排序规则。 升序排列: let arr = [3, 1, 4, 7, 2]; arr.sort((a, b) => a – b); console.log(arr); /…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部