C语言下快速排序(挖坑法)详解

C语言下快速排序(挖坑法)详解

什么是快速排序

快速排序是将一个待排序的序列分成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再对这两部分分别进行排序,递归执行该操作直到将整个序列排好为止。快速排序使用了分治思想。由于在每一次的递归过程中,都将待排序的序列分成两部分,因此处理的数据量不断减少,使得算法的效率比较高。

快速排序的实现

挖坑法

挖坑法的基本思想是首先选择一个基准数,用两个标记i和j从序列两端分别向中间扫描,当i遇到了比基准数大的数就停下来,当j遇到了比基准数小的数就停下来,然后交换i和j所指向的元素。直到i和j重合,此时就可以将基准数放在这个位置上,以此将序列分成两个子序列,然后递归地对这两个子序列进行排序。

具体实现的过程如下:

首先选择序列的第一个元素作为基准数pivot,设定i和j的初始值分别为左端点left和右端点right,然后从j开始,向左扫描序列,找出第一个小于基准数的元素,停在j位置上,这时候将pivot的值赋给i,实现了一个“挖坑”操作。接着,从i开始,向右扫描序列,找出第一个大于基准数的元素,停在i位置上,这时候就可以将j位置上的元素填到这个坑中,实现了一个“填坑”操作。随后,i和j再次向中间移动,继续扫描序列,直到i和j重合。最后,将pivot放在i/j重合的位置上,这样就将序列分成了两部分,并以此递归执行。

下面是基于挖坑法的快速排序的代码实现:

void QuickSort(int arr[], int left, int right) {
    if (left >= right) return; // 如果序列只剩下一个元素或者没有元素,则直接返回
    int i = left, j = right, pivot = arr[left]; // 初始化指针i、j,以及基准数pivot
    while (i < j) {
        while (arr[j] >= pivot && i < j) j--;
        if (i < j) arr[i++] = arr[j]; // 挖坑
        while (arr[i] <= pivot && i < j) i++;
        if (i < j) arr[j--] = arr[i]; // 填坑
    }
    arr[i] = pivot; // 将基准数放入最后的空位
    QuickSort(arr, left, i - 1); // 递归排序左边的子序列
    QuickSort(arr, i + 1, right); // 递归排序右边的子序列
}

示例说明

示例一

给定一个数组 arr = {6, 2, 7, 3, 8, 9, 4, 5, 1},使用快速排序对其进行从小到大排序。

首先选定 arr[0],即6作为基准数pivot。然后i和j指向数组的两端 left = 0, right = 8。从j开始,往左寻找第一个小于pivot的数,即找到了 arr[6] = 4,同时将 arr[0] 填上这个坑,得到 arr[0, 2, 7, 3, 8, 9, 4, 5, 4];接着,从i开始,往右寻找第一个大于pivot的数,即找到了 arr[1] = 2,同时将 arr[6] 填上这个坑,得到 arr[2, 2, 7, 3, 8, 9, 6, 5, 4]。i和j在此时重合,将pivot放在这个位置上,得到了 arr[2, 2, 4, 3, 1, 5, 6, 7, 9, 8]。此时将序列分成了两部分,左半部分都小于pivot,右半部分都大于pivot,递归进行排序即可。

经过一次分割后,左半部分为 {2, 2, 4, 3, 1},右半部分为 {5, 6, 7, 9, 8}。以左半部分为例,选择 arr[0] 作为基准数pivot,进行相同的操作,即先从右向左找到一个小于pivot的数 arr[3] = 3,用 arr[0] 填坑,得到 arr[1, 2, 4, 3, 1];接着再从左向右找到第一个大于pivot的数 arr[2] = 4,用 arr[3] 填坑,得到 arr[1, 2, 3, 4, 1]。此时将pivot放在最后的位置上,得到 arr[1, 2, 3, 4, 6]。随后对右半部分进行相似的操作,最终得到完整的排好序的数组 arr[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例二

给定一个数组 arr = {9, 8, 7, 6, 5, 4, 3, 2, 1},使用快速排序对其进行从大到小排序。

首先选定 arr[0],即9作为基准数pivot。然后i和j指向数组的两端 left = 0, right = 8,从j开始寻找小于pivot的数,由于数组本身就是从大到小排列的,因此找不到小于9的数。接着,从i开始寻找大于pivot的数,找到了 arr[1] = 8,用 arr[0] 填坑,得到 arr[9, 9, 7, 6, 5, 4, 3, 2, 1],继续寻找直到i和j重合,最后将pivot放在此位置上,即 arr[8, 9, 7, 6, 5, 4, 3, 2, 1]。此时将序列分成了两部分,左半部分都大于pivot,右半部分都小于pivot,以此递归进行后续排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言下快速排序(挖坑法)详解 - Python技术站

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

相关文章

  • 大数据情况下桶排序算法的运用与C++代码实现示例

    桶排序算法是一种基于计数的排序算法,它的主要思想是把一组数据分成多个桶,对每个桶中的数据进行排序,最后依次把每个桶中的数据合并起来,得到排序后的结果。在大数据情况下,桶排序算法可以大幅减少排序时间,因为它可以快速地将数据分成多个桶,进行并行排序,最终合并起来。 以下是桶排序算法在大数据情况下的运用及C++代码示例: 算法思路 先确定桶的数量,也就是需要将数据…

    算法与数据结构 2023年5月19日
    00
  • C++ 实现桶排序的示例代码

    下面是一份详细的攻略,带有示例说明。 桶排序简介 桶排序是一种基于计数的排序算法。它将一些数据分到不同的桶里,再对每个桶中的数据进行排序,最后按照桶的顺序依次输出所有数据,即可得到排好序的序列。 桶排序的时间复杂度是 $O(n)$,空间复杂度也是 $O(n)$,适用于元素值分布比较均匀的数据。 C++ 桶排序示例 下面是一份 C++ 实现桶排序的示例代码: …

    算法与数据结构 2023年5月19日
    00
  • C/C++实现三路快速排序算法原理

    C/C++实现三路快速排序算法原理 算法概述 三路快速排序算法是一种优化版本的快速排序算法,能够处理含有大量重复元素的数组,避免了快速排序中大量递归处理相等元素的繁琐工作。 三路快速排序的原理是采用三个指针将数组分成小于、等于和大于三个部分,递归地向下快速排序,最终将整个数组排序。 实现步骤 首先选取数组中的一个元素作为标志物,通常是数组的第一个元素。 定义…

    算法与数据结构 2023年5月19日
    00
  • python KNN算法实现鸢尾花数据集分类

    Python实现KNN算法对鸢尾花数据集进行分类 介绍 KNN(K-Nearest-Neighbor)算法是一种非常常用且简单的分类算法之一。它的基本思想是把未知数据的标签与训练集中最邻近的K个数据的标签相比较,得票最多的标签就是未知数据的标签。本文将介绍如何使用Python实现对鸢尾花数据集进行KNN分类。 步骤 加载数据 首先,我们需要加载鸢尾花数据集。…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现的七种排序算法总结(推荐!)

    JavaScript实现的七种排序算法总结(推荐!) 简介 本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。 插入排序 插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排…

    算法与数据结构 2023年5月19日
    00
  • 纯python实现机器学习之kNN算法示例

    首先我们需要清楚kNN算法的基本思想。kNN算法是一种基于实例的有监督学习算法,可以用于分类和回归问题。对于一个新的未标记数据,该算法会根据其与训练集中数据的距离,找到距离该点最近的k个点,然后根据这k个点的标签或者值来对该点进行分类或回归。 以下是具体实现步骤: 准备数据 kNN算法需要一个已经标记好的训练数据集。这里我们以Iris花卉数据集为例。我们先把…

    算法与数据结构 2023年5月19日
    00
  • 冒泡排序算法及Ruby版的简单实现

    冒泡排序是一种比较简单的排序算法,其基本思想是重复地遍历数列,每次比较相邻的两个元素,如果前一个元素比后一个元素大,则交换这两个元素的位置,直到遍历完整个数列,这样一次遍历后,数列中最大的元素就被排到了最后面。重复执行此过程,直到整个数列有序为止。 以下是冒泡排序算法的Ruby版简单实现: def bubble_sort(array) n = array.l…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中数组随机排序的实现详解

    下面是我对于“JavaScript中数组随机排序的实现详解”的完整攻略。 概述 在JavaScript中,数组是一个非常有用的数据类型,而随机排序是在处理数组时非常实用的一种技术。本攻略将为你详细讲解如何实现JavaScript数组的随机排序。 方法一:使用sort()方法 JavaScript中的数组包含一个sort()方法,可以对数组中的元素进行排序。我…

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