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日

相关文章

  • Go语言展现快速排序算法全过程的思路及代码示例

    这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。 什么是快速排序算法 快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。 快速排序算法的实现思路 下面是快…

    算法与数据结构 2023年5月19日
    00
  • js交换排序 冒泡排序算法(Javascript版)

    JavaScript冒泡排序算法 算法描述 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列,一次比较相邻的两个元素,如果它们的顺序错误就将它们交换。遍历序列的工作是重复地进行直到没有再需要交换,也就是说该序列已经排序完成。 算法实现 JavaScript 代码 function bubbleSort(arr) { var l…

    算法与数据结构 2023年5月19日
    00
  • C#中使用快速排序按文件创建时间将文件排序的源码

    下面就来详细讲解如何在C#中使用快速排序按文件创建时间将文件排序的源码攻略。 1. 快速排序原理 快速排序(Quick Sort)是一种基于分治法的高效排序算法,其主要思想是选择一个基准点(pivot),将数组分为左右两个子数组,将左边的数组的元素都小于基准点,右边的数组的元素都大于基准点,再递归对左右子数组进行快排操作,直到子数组长度为1或0。快速排序的时…

    算法与数据结构 2023年5月19日
    00
  • 如何用C++实现A*寻路算法

    一、什么是A*寻路算法? A寻路算法(A search algorithm),也叫A算法,是一种启发式搜索算法,常用于求解路径规划问题。A算法结合了Dijkstra算法和启发式搜索的优点,能够在保证找到最短路径的情况下,大大降低搜索的时间和空间消耗。 二、A*寻路算法的原理 1.最短路径 在计算机科学中,最短路径问题是指两点之间的所有路径中,经过的边或节点数…

    算法与数据结构 2023年5月19日
    00
  • PHP简单选择排序(Simple Selection Sort)算法学习

    PHP简单选择排序(Simple Selection Sort)算法学习 算法介绍 简单选择排序,也称直接选择排序,是一种简单直观的排序算法,其基本思想是:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序的时间复杂度为 $O(n^2)$,不适用于大规模数据排序。但选择排序的思想被很多高级排序…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现数组全排列、去重及求最大值算法示例

    JavaScript实现数组全排列、去重及求最大值算法示例 实现数组全排列 数组的全排列即为将数组中所有元素进行全排列的结果。实现数组全排列的常用方法为回溯法。 回溯法的思想是从第一个元素开始,固定第一个元素,对于剩下的元素进行全排列,得到结果后将第一个元素与第二个元素交换,并对第二个元素之后的元素进行全排列,以此类推,直到最后一个元素,此时将所有的结果返回…

    算法与数据结构 2023年5月19日
    00
  • c++入门必学库函数sort的基本用法

    一、sort函数的基本介绍 sort()函数是C++ STL标准库提供的一种排序函数,能够对数组或容器进行排序。可以用于排序基本数据类型、结构体、对象等各种数据类型。其中,数组的排序时简单易行的,容器的排序则更加强大方便。 sort()的函数原型如下: template<class RandomAccessIterator> void sort(…

    算法与数据结构 2023年5月19日
    00
  • c++深入浅出讲解堆排序和堆

    C++深入浅出讲解堆排序和堆 堆的定义 堆是一种特殊的树形数据结构,它满足以下两个特性: 堆是一个完全二叉树(Complete Binary Tree); 堆中每个节点的值都大于等于(或小于等于)其左右子节点的值。 可以看出,堆一般分为两种类型:大根堆(Max Heap)和小根堆(Min Heap)。大根堆的每个节点的值都大于等于其左右子节点的值,小根堆则相…

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