C语言完整实现12种排序算法(小结)

C语言完整实现12种排序算法(小结)

本文主要介绍了C语言实现12种排序算法的详细过程以及相关示例。

排序算法的分类

排序算法可分为内部排序和外部排序。内部排序是指将待排序的数据全部加载到内存中进行排序,而外部排序是指在数据量过大时需要将数据分块,对每一块数据进行排序,最后将各个块合并起来,得到有序的结果。

在内部排序中,常用的排序算法大致可分为以下几类:

冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的元素,一次比较两个元素,如果它们的顺序错误就把它们交换过来。时间复杂度为 $O(n^2)$。

选择排序

选择排序是一种简单的排序算法,它每次从待排序的数据中选出最小(或最大)的元素,放在已排序的数据的末尾。时间复杂度为 $O(n^2)$。

插入排序

插入排序是一种简单直观的排序算法,它将待排序的数据分为已排序和未排序两个部分,每次从未排序的部分中取出一个元素,插入到已排序的部分中,时间复杂度为 $O(n^2)$。

希尔排序

希尔排序是一种插入排序的优化算法,它通过间隔不断缩小的方式,对待排序的数据进行多次插入排序。时间复杂度为 $O(n^{\frac{3}{2}})$。

归并排序

归并排序是一种使用分治思想的排序算法,它将待排序的序列划分成两个子序列,对每个子序列进行递归排序,最后将两个已排序的子序列合并成一个有序的序列。时间复杂度为 $O(n\log_2 n)$。

快速排序

快速排序也是一种使用分治思想的排序算法,它将待排序的序列划分成两个子序列,以基准元素为标准将序列分为小于基准元素和大于基准元素两部分,递归地对两个子序列进行快速排序。时间复杂度为 $O(n\log_2 n)$。

堆排序

堆排序是一种利用堆这种数据结构设计的排序算法,它首先将待排序的数据看成一个完全二叉树(堆),然后将该堆调整为最大堆或最小堆,再依次取出堆顶元素进行排序。时间复杂度为 $O(n \log_2 n)$。

基数排序

基数排序是一种非比较型的排序算法,它将待排序的元素拆分成若干个数字位,利用每一位的值进行排序,并依次进行桶排序。时间复杂度为 $O(nk)$,其中 $k$ 表示数字的位数。

示例说明

示例1

下面是冒泡排序的代码示例:

void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len-1; i++) {
        for (j = 0; j < len-1-i; j++) {
            if (arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

对于数组 arr,调用 bubble_sort(arr, len) 就可以进行冒泡排序。假设 arr{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},则排序后的结果为 {1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9}

示例2

下面是归并排序的代码示例:

void merge(int arr[], int left, int mid, int right, int temp[]) {
    int i = left, j = mid+1, k = 0;
    while (i <= mid && j <=right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (i = 0; i < k; i++) {
        arr[left+i] = temp[i];
    }
}

void merge_sort(int arr[], int left, int right, int temp[]) {
    if (left < right) {
        int mid = (left + right) / 2;
        merge_sort(arr, left, mid, temp);
        merge_sort(arr, mid+1, right, temp);
        merge(arr, left, mid, right, temp);
    }
}

void merge_sort(int arr[], int len) {
    int *temp = (int*)malloc(len*sizeof(int));
    merge_sort(arr, 0, len-1, temp);
    free(temp);
}

对于数组 arr,调用 merge_sort(arr, len) 就可以进行归并排序。假设 arr{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},则排序后的结果为 {1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言完整实现12种排序算法(小结) - Python技术站

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

相关文章

  • C#归并排序的实现方法(递归,非递归,自然归并)

    下面是关于C#归并排序的实现方法的完整攻略: 什么是归并排序? 归并排序是一种基于分治法的算法,具体实现方法是将原序列分成若干个子序列,分别进行排序,然后将排好序的子序列合并成一个大的有序序列。 递归实现归并排序 递归实现归并排序分为三步: 分解数组:将要排序的数组从中间分成两个部分,即分为左右两个子数组。这里使用数组下标来实现。 递归排序子数组:对分解出来…

    算法与数据结构 2023年5月19日
    00
  • C/C++浅析邻接表拓扑排序算法的实现

    C/C++浅析邻接表拓扑排序算法的实现 什么是拓扑排序 在图论中,若存在一种拓扑序列,使得对于任意的有向边(u,v),u在序列中都在v的前面,则称该图为拓扑排序,该序列称为拓扑序列。拓扑排序是一个有向无环图(DAG, Directed Acyclic Graph)的一种线性序列。 拓扑排序算法的实现 拓扑排序算法的实现一般基于邻接表,其核心思路为:先将所有入…

    算法与数据结构 2023年5月19日
    00
  • JS栈stack类的实现与使用方法示例

    JS栈Stack类的实现与使用方法示例 一、栈的概念 栈(stack)是一种线性数据结构,它有两个主要操作:入栈(push)和出栈(pop)。栈的特点是先进后出(FILO,First In, Last Out)。从数据结构的角度来说,栈是在同一端进行插入和删除操作的一种数据结构。该端被称为栈顶,相对地,把另一端称为栈底。 在计算机科学中,栈具有非常重要的作用…

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

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

    算法与数据结构 2023年5月19日
    00
  • python manim实现排序算法动画示例

    首先,为了能够实现“python manim实现排序算法动画示例”,我们需要以下准备工作: 安装python及相关依赖:Manim(用于动画制作)、Numpy(用于数值计算)等。 了解Python编程语言的基础语法和数据类型。 接下来,我们可以按照以下步骤进行排序算法动画制作: 选择一种排序算法,并按照代码形式将其实现。 使用Python的可视化库,将算法过…

    算法与数据结构 2023年5月19日
    00
  • JavaScript插入排序算法原理与实现方法示例

    JavaScript插入排序算法原理与实现方法示例 算法原理 插入排序是一种简单直观的排序算法,其基本原理是将一个待排序的数组依次插入一个有序的数组中,使得最终生成的有序数组是全局有序的。每次将一个待排序的元素插入到有序数组中时,我们从有序数组的末尾开始比较,如果待排序的元素比当前比较的元素小,则交换位置,继续比较,否则插入到当前位置。 实现方法 下面是Ja…

    算法与数据结构 2023年5月19日
    00
  • STl中的排序算法详细解析

    STl中的排序算法详细解析 概述 在STL中,sort是一种常用的排序算法。sort算法旨在将元素从小到大排序,但也可以使用cmp函数指定排序方式。 算法实现 sort算法基于“快速排序”算法的实现。其基本思想是从待排序列中选取一定的数值作为划分元素(pivot),通过一趟排序将所有比该元素小的数放到它的左边,所有比该元素大的数放到它的右边,然后再对左右两个…

    算法与数据结构 2023年5月19日
    00
  • JS常用排序方法实例代码解析

    JS常用排序方法实例代码解析 在 JavaScript 中,有很多种排序方法可以使用。本文将介绍常用的四种排序方法及其实例代码,包括冒泡排序、选择排序、插入排序和快速排序。 冒泡排序 冒泡排序是一种简单、但效率低下的排序算法。基本思路是将相邻的两个数进行比较,如果前面的数比后面的数大,则交换这两个数的位置,一直重复这个过程,直到最后一个数是最大数为止。 fu…

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