C语言基本排序算法之插入排序与直接选择排序实现方法

C语言基本排序算法之插入排序与直接选择排序实现方法

本文将介绍C语言中两种常见的基本排序算法:插入排序和直接选择排序。我们将会详细阐述它们的实现方法,并提供示例代码来帮助理解和实践。

插入排序

插入排序是一种简单而常见的排序算法,它将待排序的数列分成已排序和未排序两部分,初始时已排序部分只包含一个元素,随着算法的运行,每次从未排序部分中取出第一个元素插入到已排序部分的合适位置,直到全部元素排序完毕。

具体实现方法如下:

void insertionSort(int arr[], int size) {
    int i, j, current;
    for (i = 1; i < size; i++) {
        current = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > current) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = current;
    }
}

插入排序是指在已排好序列中找到合适的位置插入当前元素,使得插入后的序列仍然有序。在实现上,我们使用了一个游标变量current来记录当前需要插入的元素,然后通过一个内层循环将已排序的元素逐个向后移位,直到找到前一个元素比current小(或已经到达序列起始位置),这时我们就知道current应该插入在这个元素后面。

下面是一个示例,演示了上述代码的运行过程:

原始数组: [25, 17, 31, 13, 2]

- 第一次排序之后: [17,25,31,13,2]
- 第二次排序之后: [17,25,31,13,2]
- 第三次排序之后: [13,17,25,31,2]
- 第四次排序之后: [2,13,17,25,31]

从上面的示例中可以看出,插入排序算法的时间复杂度为$O(n^2)$,因此在大规模数据排序时可能效率较低,但对于小规模数据排序时,插入排序是一个不错的选择。

直接选择排序

直接选择排序也是一种常见的排序算法,它的思路是将剩余未排序的最小值不断交换到剩余序列的最前端,直到所有元素按照从小到大的顺序排好。

具体实现方法如下:

void selectionSort(int arr[], int size) {
    int i, j, minIndex, temp;
    for (i = 0; i < size - 1; i++) {
        minIndex = i;
        for (j = i + 1; j < size; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

在实现中,我们首先通过一个外层循环来遍历整个数组,然后从当前未排序元素的剩余序列中寻找最小值,记下它的下标,最后将它和当前未排序序列中的第一个元素交换。这个交换操作相当于将当前未排序序列的最小值插入到已排序部分的末尾。

下面是一个示例,演示了上述代码的运行过程:

原始数组: [25, 17, 31, 13, 2]

- 第一次排序之后: [2, 17, 31, 13, 25]
- 第二次排序之后: [2, 13, 31, 17, 25]
- 第三次排序之后: [2, 13, 17, 31, 25]
- 第四次排序之后: [2, 13, 17, 25, 31]

直接选择排序算法的时间复杂度也为$O(n^2)$,但由于每次只需要做一次交换操作,因此在某些情况下它比插入排序的效率更高。

总结

插入排序和直接选择排序是两种常见的基本排序算法,它们的实现都相对简单,适用于小规模的数据排序。如果需要对大规模数据进行排序,可以考虑使用其他更为高效的排序算法,如快速排序、归并排序等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言基本排序算法之插入排序与直接选择排序实现方法 - Python技术站

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

相关文章

  • 详解Bucket Sort桶排序算法及C++代码实现示例

    接下来我会详细讲解“详解Bucket Sort桶排序算法及C++代码实现示例”的完整攻略。 什么是桶排序算法? 目前,排序算法很多,常用的有冒泡排序、选择排序、插入排序、快速排序、归并排序等等算法。其中,桶排序(Bucket Sort)是比较特殊的一种排序方法。顾名思义,桶排序就是把数据分到不同的桶里,然后对每个桶里的数据进行排序。支持桶排序的数据类型必须是…

    算法与数据结构 2023年5月19日
    00
  • C语言下快速排序(挖坑法)详解

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

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

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

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言 详细解析时间复杂度与空间复杂度

    C语言详解时间复杂度与空间复杂度 什么是时间复杂度和空间复杂度? 在计算机科学中,时间复杂度和空间复杂度用于衡量算法执行效率的指标。 时间复杂度指算法运行所需的时间,一般用大O记法表示,例如O(n)、O(n²),其中n代表输入数据规模。 空间复杂度指算法运行所需的存储空间,也一般用大O记法表示,例如O(n)、O(n²),其中n代表输入数据规模。 时间复杂度示…

    算法与数据结构 2023年5月19日
    00
  • java图搜索算法之图的对象化描述示例详解

    Java图搜索算法之图的对象化描述示例详解 什么是图? 图是一种非线性数据结构,由节点和边组成,节点表示图中对象,边表示节点间相互关系。图分为有向图和无向图,有向边和无向边。 图的对象化描述 Java中可以使用对象化的方式来描述一个图,主要有两个类: Vertex(节点类) 节点类表示图中的节点,主要有两个属性: label:节点标签,用于区分不同节点。 w…

    算法与数据结构 2023年5月19日
    00
  • 利用C++的基本算法实现十个数排序

    利用C++的基本算法实现十个数排序 1. 算法选择 排序问题常见的算法有冒泡排序、插入排序、选择排序、快速排序等,它们的时间复杂度不尽相同,但在本题目的情况下,十个数的排序任何算法都可以。 为了方便,本文将使用最简单的冒泡排序算法。 2. 代码实现 冒泡排序算法的基本思路是从头到尾扫描一遍数组,比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们…

    算法与数据结构 2023年5月19日
    00
  • 思科CCNA认证学习笔记(一)网络基础知识

    思科CCNA认证学习笔记(一)网络基础知识攻略 概述 思科CCNA认证是网络行业的重要认证之一,具有广泛的认可度和传播力。其中网络基础知识是CCNA考试的重要内容,对于初学者来说,掌握网络基础知识是入门的必经之路。本篇攻略将详细讲解网络基础知识的相关内容,包括讲解网络的概念、网络的分类、网络的拓扑结构、网络的协议以及网络的设备。 网络的概念 网络是由两台或两…

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