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日

相关文章

  • 几种经典排序算法的JS实现方法

    一、冒泡排序 原理 冒泡排序将待排序元素两两比较,根据比较结果交换位置,一遍冒泡会让至少一个元素到达最终位置。重复这个过程,直到排序完成。 JS实现 function bubbleSort(arr) { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = 0; j &…

    算法与数据结构 2023年5月19日
    00
  • JS中数组随机排序实现方法(原地算法sort/shuffle算法)

    JS中实现数组随机排序有两种常见方法:原地随机排序算法和使用shuffle算法。 原地随机排序算法 原地随机排序算法(in-place shuffle algorithm)是将数组中元素随机地乱序,同时保持每个元素之间的相对位置不变。算法的时间复杂度是O(n),空间复杂度是O(1),因为所有的操作都是在原数组上进行。 实现步骤 获取数组长度 从数组的最后一个…

    算法与数据结构 2023年5月19日
    00
  • C/C++语言八大排序算法之桶排序全过程示例详解

    C/C++语言八大排序算法之桶排序全过程示例详解 什么是桶排序 桶排序(Bucket Sort)是一种线性排序算法,它的基本思想是将数组内的元素根据某个规则分配到若干个桶中,然后对每个桶内的元素进行排序,最终合并每个桶内的有序元素即可得到原数组的有序结果。 桶排序的主要应用场景是待排序元素的分布比较均匀的情况下,性能表现优于其他排序算法(例如快速排序、归并排…

    算法与数据结构 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
  • java实现图形卡片排序游戏

    以下是“Java实现图形卡片排序游戏”的完整攻略。这个游戏的目标是将打乱的卡片,按顺序排好。具体的操作方法是通过拖拽卡片,让卡片位置移动进行排序。 技术栈 Java语言 Swing GUI库 排序算法 功能设计 加载卡片图片及绑定事件处理方法 卡片随机化处理 拖拽移动卡片 实现移动时的动画效果 判断拼图是否按顺序排好 记录游戏步骤、分数等信息 具体实现 加载…

    算法与数据结构 2023年5月19日
    00
  • 逐步讲解快速排序算法及C#版的实现示例

    逐步讲解快速排序算法及C#版的实现示例 1. 快速排序算法简介 快速排序算法是一种高效的排序算法,它的时间复杂度为 $O(nlogn)$。它的基本思想是通过一次划分将原问题分解为两个子问题,再对子问题进行递归解决,最终得到排序结果。 2. 快速排序算法核心思想 快速排序算法的核心思想是选取一个基准元素,将待排序的序列分成两部分,一部分比基准元素小,一部分比基…

    算法与数据结构 2023年5月19日
    00
  • Java快速排序案例讲解

    Java快速排序案例讲解 快速排序(Quicksort)是一种常见的排序算法,它的时间复杂度为O(nlogn),是一种效率较高的排序算法,在实际开发中也广泛应用。本文将介绍Java快速排序的实现过程以及具体实现。 快速排序介绍 快速排序是通过选择一个“基准数”,然后把整个数组分成两部分,分别为小于等于“基准数”的部分和大于“基准数”的部分。然后再对这两个部分…

    算法与数据结构 2023年5月19日
    00
  • Python利用treap实现双索引的方法

    Python利用treap实现双索引的方法 本文将介绍如何用Python语言实现基于treap的双索引方法来建立文本检索系统。 什么是treap? treap是一种二叉搜索树和堆(heap)的混合体。在treap中,每个节点包含一个键值和一个随机权重值。treap强制节点按照二叉搜索树的顺序排列,同时也保持堆的性质,即每个节点的权重都会小于其子节点的权重。这…

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