C语言常见排序算法之交换排序(冒泡排序,快速排序)

交换排序主要有两种:冒泡排序和快速排序。下面我将分别详细介绍这两种排序算法的原理、过程和示例。

冒泡排序

原理

冒泡排序是一种基本的排序方法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复操作直到排序完成。

过程

冒泡排序的过程可以被描述如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始的一对到结尾的最后一对。在这一步执行完后,最后的元素是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 重复步骤1~3,直到排序完成。

示例

下面是一个冒泡排序的例子:

int a[] = {56, 12, 78, 23, 99, 43, 21, 10};
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len - 1; i++)
{
    for (int j = 0; j < len - 1 - i; j++)
    {
        if (a[j] > a[j + 1])
        {
            int tmp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = tmp;
        }
    }
}

在上面的例子中,我们先定义一个待排序的数组a,然后通过两层循环遍历数组,若前面的数大于后面的数,则交换两个数的位置。最后得到的数组为{10, 12, 21, 23, 43, 56, 78, 99},也就是一个从小到大排列的有序数组。

快速排序

原理

快速排序是目前使用最广泛的排序算法之一。它采用的是分治法的思想,基本思路是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均小于另一部分记录的关键字,分别对这两部分继续进行排序,以达到整个序列有序的目的。

过程

快速排序的过程可以被描述如下:

  1. 从数列中挑出一个元素,称为“基准”。
  2. 重新排列数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以放到任一边)。在这个分区结束后,该基准就处于数列的中间位置。称之为分区操作。
  3. 递归地(recursive)把小于基准值的子数列和大于基准值的子数列排序。

示例

下面是一个快速排序的例子:

void quickSort(int a[], int start, int end)
{
    if (start >= end)
    {
        return;
    }
    int left = start;
    int right = end;
    int pivot = a[left];
    while (left < right)
    {
        while (left < right && a[right] >= pivot)
        {
            right--;
        }
        a[left] = a[right];
        while (left < right && a[left] <= pivot)
        {
            left++;
        }
        a[right] = a[left];
    }
    a[left] = pivot;
    quickSort(a, start, left - 1);
    quickSort(a, left + 1, end);
}

在上面的例子中,我们定义了一个快速排序函数quickSort,并传入待排序的数组a以及排序的起始和结束位置start和end。在函数内部,我们先确定一个基准pivot为数组的第一个元素a[start],然后通过两个指针left和right,不断向中间移动,在移动的过程中不断比较left和right指针所指的数和基准pivot的大小,直到left和right指针重合。这个过程可以视为一个“分区”的过程,被分成基准左边的数和右边的数。接着我们对左右两个分区分别递归执行这个过程即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言常见排序算法之交换排序(冒泡排序,快速排序) - Python技术站

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

相关文章

  • ASP使用FSO读取模板的代码

    ASP(Active Server Pages)是Microsoft公司推出的一种服务器端动态网页开发技术。FSO(File System Object)是ASP中访问文件系统的一种重要方式。通过FSO,我们可以实现对文件的读写、创建和删除等操作。在ASP中使用FSO读取模板文件,可以实现动态网站中的静态内容显示。下面是使用FSO读取模板文件的完整攻略: 1…

    算法与数据结构 2023年5月19日
    00
  • C语言常见排序算法之插入排序(直接插入排序,希尔排序)

    接下来我将为大家详细讲解“C语言常见排序算法之插入排序(直接插入排序, 希尔排序)”。 直接插入排序 算法思路 直接插入排序算法的实现思路是:将一个无序的数据序列分为一个有序子序列和一个无序子序列两部分,将无序子序列的元素一个一个插入到有序子序列中,直到插入完所有元素,最终形成一个新的有序序列。在具体编写代码时,我们会将数据序列看作是一个数组来进行操作。 代…

    算法与数据结构 2023年5月19日
    00
  • Javascript实现快速排序(Quicksort)的算法详解

    Javascript实现快速排序的算法详解 在这个攻略中,我们将通过Javascript实现快速排序算法,并讲解算法的详细过程。 快速排序的基本思想 快速排序是一种基于交换的排序算法,其基本思想是通过选择一个基准元素,在一趟排序过程中,将之前需要排序的序列中的元素分割成两个部分,其中,左边部分元素的值都小于基准元素的值,右边部分元素的值都大于基准元素的值,然…

    算法与数据结构 2023年5月19日
    00
  • Flutter Dart快速排序算法示例详解

    Flutter Dart快速排序算法示例详解 介绍 快速排序是一种排序算法,其基本思想是选择一个基准元素,将数组分成两个子数组,其中一个子数组的元素都比基准元素小,另一个子数组的元素都比基准元素大。然后递归地对两个子数组进行快速排序。 实现步骤 选择一个基准元素,并将其从数组中移除。 遍历数组,将小于基准元素的元素放入一个新的左侧数组中,大于基准元素的元素放…

    算法与数据结构 2023年5月19日
    00
  • Python 数据结构之十大经典排序算法一文通关

    Python 数据结构之十大经典排序算法一文通关 一、前置知识 在学习本文之前,需要具备以下基础知识: Python 基础语法 算法与数据结构基础 二、十大经典排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 本文将一一讲解这十种排序算法。 三、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历过要排…

    算法与数据结构 2023年5月19日
    00
  • 详解次小生成树以及相关的C++求解方法

    详解次小生成树以及相关的C++求解方法 什么是次小生成树 在普通的生成树中,每个节点只有一条边与其相连。而次小生成树则是指,在所有的生成树中,除了最小生成树之外,权值和第二小的生成树。 求解方法 Kruskal算法 Kruskal算法是一种贪心算法,也是求解最小生成树的常用算法。我们可以对Kruskal算法做一些修改,使其求出次小生成树。 一般情况下,我们需…

    算法与数据结构 2023年5月19日
    00
  • python快速排序代码实例

    Python 快速排序 (Quick Sort) 是一种排序算法,它利用分治思想来快速排序一个数组或序列。该算法的时间复杂度为 O(nlogn)。 要理解快速排序算法,我们需要掌握以下概念: 基准值 (pivot):排序过程中用于比较的值。在每一轮的排序过程中,基准值会将数组或序列分成两部分。 子数组 (subarray):对于一个数组或序列,它的一部分就是…

    算法与数据结构 2023年5月19日
    00
  • C语言实现文件内容按行随机排列的算法示例

    下面我将为您详细介绍“C语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

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