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日

相关文章

  • Redis使用ZSET实现消息队列使用小结

    Redis使用ZSET实现消息队列使用小结 概述 Redis是一款功能强大的开源的In-Memory数据结构存储系统,除了支持key-value结构外,它还提供了List、Set、Hash和ZSet。其中ZSet是有序集合,它可以在插入元素时指定一个score值,可以根据score进行排序,也可以查看属于某个score范围内的元素。因此,ZSet也可以用来实…

    算法与数据结构 2023年5月19日
    00
  • 修复IE9&safari 的sort方法

    修复IE9和Safari的sort()方法需要遵循以下步骤: 1. 检查代码 要修复排序方法,首先需要检查代码,找出可能存在的问题。请确保你的代码中使用的是正确的sort()方法,并且没有拼写错误和语法问题。同时,还要检查你的代码能否适用于所有浏览器。 2. 自定义排序方法 当浏览器不支持sort()方法时,我们可以自定义一个排序方法来替代它。我们可以使用J…

    算法与数据结构 2023年5月19日
    00
  • c++中八大排序算法

    c++中八大排序算法 本文介绍的是C++中八大排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序和计数排序。下面将对这八种算法进行详细讲解。 冒泡排序 冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地遍历要排序的列表,比较每对相邻的项,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行知道没有再需…

    算法与数据结构 2023年5月19日
    00
  • Python实现二维有序数组查找的方法

    首先,我们需要了解什么是二维有序数组。二维有序数组,也叫做二维矩阵,是一个含有 m 行 n 列的矩阵,每行每列都是有序的。在这个二维有序数组中,我们需要实现一个二分查找算法,用来查找某个目标值是否存在于这个矩阵中。 以下是步骤: 1. 将二维矩阵转换为一维数组 由于二维矩阵每一行每一列都是有序的,我们可以将二维矩阵看成一个一维数组,即将每一行连在上一行的后面…

    算法与数据结构 2023年5月19日
    00
  • JS排序之快速排序详解

    JS排序之快速排序详解 快速排序是一种高效的排序算法,它的核心思想是分治。快排的具体步骤如下: 选择一个基准元素,将序列中所有元素和这个基准元素进行比较,将比基准元素小的元素放入左侧序列,将比基准元素大的元素放入右侧序列。 递归地对左右两个子序列进行快速排序,直到每个子序列只有一个元素或者为空。 示例1:将序列[3,1,6,4,8,2,5,7]进行快速排序。…

    算法与数据结构 2023年5月19日
    00
  • java ArrayList按照同一属性进行分组

    要按照同一属性进行分组,我们需要用到Java中的Collections类和Comparator接口。 首先,我们需要为ArrayList中的对象定义一个属性,以便按照该属性进行分组。例如,我们定义一个Person类,其中包含name和age两个属性,我们想要按照年龄进行分组。则代码如下: public class Person { private Strin…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中的冒泡排序法

    JavaScript中的冒泡排序法 冒泡排序法就是通过比较任意两个相邻的元素,然后循环遍历整个数组,逐步将最大(或最小)的数移到最后一位。当没有相邻的元素需要互换位置的时候即可完成排序。冒泡排序法是常用的简单排序算法,虽然时间复杂度比高级算法如快速排序、堆排序等要高,但是对于小的数据集合,其性能表现要好于其他排序算法。 以下是冒泡排序法的具体实现: func…

    算法与数据结构 2023年5月19日
    00
  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

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