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

yizhihongxing

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

冒泡排序

原理

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

过程

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

  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日

相关文章

  • PHP常用的排序和查找算法

    PHP常用的排序和查找算法 排序算法 冒泡排序 冒泡排序是一种简单的排序算法。 它多次遍历要排序的列表,每次比较相邻的两项,如果它们的顺序错误就把它们交换过来。 示例代码如下: function bubble_sort($arr) { $len = count($arr); for($i=1; $i<$len; $i++) { for($j=0; $j…

    算法与数据结构 2023年5月19日
    00
  • 用C语言实现二分查找算法

    当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。 以下是在C语言中实现二分查找的完整…

    算法与数据结构 2023年5月19日
    00
  • C语言实现单链表的快速排序算法

    下面是详细的攻略: 单链表快速排序算法的原理 在单链表上实现快速排序,需要了解快速排序算法的原理。快速排序是一种常用的基于比较的排序算法,它的基本思想是:选取一个基准元素(pivot),将数组分成两个部分,一个部分是小于基准元素的,一个部分是大于基准元素的。然后对这两个部分分别递归进行快排,最终得到排序后的数组。 在单链表上,选择基准元素也是一样的,不同的是…

    算法与数据结构 2023年5月19日
    00
  • 图解Java排序算法之快速排序的三数取中法

    图解Java排序算法之快速排序的三数取中法 什么是快速排序 快速排序是一种常见的排序方法,它的特点是在待排序的记录序列中,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分的记录关键字均比另一部分的关键字小。 快速排序的基本流程 快速排序的基本流程如下: 从数列中挑出一个元素,称为“基准”(pivot)。 对数列重新排序,将比基准值小的元素放在基准前面…

    算法与数据结构 2023年5月19日
    00
  • C#实现希尔排序

    C#实现希尔排序攻略 简介 希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序(Diminishing Increment Sorting)。希尔排序首先将要排序的序列分成若干个子序列,分别进行插入排序,待子序列基本有序时,再对全体记录进行一次直接插入排序。其算法主要思想是将原序列按一定间隔分为若干子序列,对每个子序列分别进行插入排…

    算法与数据结构 2023年5月19日
    00
  • JS中的算法与数据结构之列表(List)实例详解

    首先,列表(List)是一种非常常见且重要的数据结构,用于存储一组顺序排列的数据。在JavaScript中,可以通过数组来实现列表。 具体来说,我们可能会涉及到一些常用的列表操作,例如: 在数组尾部添加一个元素 在数组特定位置插入一个元素 从数组中删除指定元素 获取数组中指定位置的元素 下面,我们将结合代码示例,一一介绍这些操作: 在数组尾部添加一个元素 在…

    算法与数据结构 2023年5月19日
    00
  • Java实现插入排序,希尔排序和归并排序

    Java实现插入排序、希尔排序和归并排序 插入排序 插入排序算法的思路是:将一个待排序的数组(序列)分为两部分,前面的有序序列和后面的无序序列,将无序序列中的每一个元素插到有序序列中的适当位置,直到无序序列为空。 Java代码实现: public static void insertionSort(int[] arr) { int i, j, temp; f…

    算法与数据结构 2023年5月19日
    00
  • Js Snowflake(雪花算法)生成随机ID的实现方法

    Js Snowflake(雪花算法)生成随机ID的实现方法 介绍 雪花算法是Twitter开源的一种简单高效、生成唯一ID的算法,可以用于解决数据分布式系统中的ID生成器。本文将介绍使用Js实现雪花算法生成随机ID的完整方法。 实现 引入 首先,我们需要引入雪花算法的js库文件snowflake.js,并在页面中引入 <script src=&quot…

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