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日

相关文章

  • js实现简单排列组合的方法

    下面是详细讲解 “js实现简单排列组合的方法” 的攻略。 排列组合的概念 排列就是由给定的n个元素中取出m(m ≤ n)个元素的所有排列总数的不同的排列数,用A(n, m)表示。例如,有3个元素A、B、C,则它们的排列有:ABC、ACB、BAC、BCA、CAB、CBA,共6种排列。 组合是指从n个不同元素中,取出m(m≤n)个元素的所有组合情况,用C(n,m…

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

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

    算法与数据结构 2023年5月19日
    00
  • TF-IDF与余弦相似性的应用(一) 自动提取关键词

    下面我将详细讲解“TF-IDF与余弦相似性的应用(一) 自动提取关键词”的完整攻略。 什么是TF-IDF? TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索与分类中的文本特征提取方法,用于评估一段文本中词的重要程度。TF-IDF的核心思想就是:一个词在一篇文档中出现的频次(TF)越高,同时…

    算法与数据结构 2023年5月19日
    00
  • JavaScript算法学习之冒泡排序和选择排序

    JavaScript算法学习之冒泡排序和选择排序 冒泡排序和选择排序是常见的两种排序算法。在本文中,我们将详细讲解这两种排序算法,并提供代码示例供读者参考。 冒泡排序 冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,依次将最大的元素冒泡到数组的末尾。 以下是冒泡排序的代码示例: function bubbleSort(array) { const…

    算法与数据结构 2023年5月19日
    00
  • PHP rsa加密解密算法原理解析

    PHP RSA加密解密算法原理解析 RSA是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥可以向外公开,用于加密数据;而私钥只由数据的持有者保管,用于解密数据。在本文中,我们会使用PHP实现RSA加密解密算法,并分享一些示例代码。 RSA加密解密算法原理 RSA加密解密算法的原理主要是基于数学中的大数分解问题和欧拉定理。以下是RSA算法的一般流程: 用…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数组基于交换的排序示例【冒泡排序】

    下面是JavaScript数组基于交换的排序示例【冒泡排序】的完整攻略: 冒泡排序 冒泡排序是最基本的排序算法之一,它的原理是通过比较相邻的元素,将较大的元素交换到右侧,较小的元素交换到左侧,最终将整个数组按照升序排列。 下面是一份基于交换的冒泡排序代码,我们通过代码中加入注释来讲解冒泡排序的实现过程: function bubbleSort(arr) { …

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

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

    算法与数据结构 2023年5月19日
    00
  • MySQL排序原理和案例详析

    MySQL排序的原理主要包括内部排序和外部排序两种方式。内部排序主要用于处理较小的数据集,而外部排序则专门用于处理大型数据集。 在内部排序中,MySQL主要采用快速排序算法进行排序。快速排序是一种常用的分治算法,其核心思想是通过将一个大问题分解成多个小问题并逐步解决,最终将所有小问题关键字的排序结果合并起来得到整个序列的有序排列。 在外部排序中,MySQL采…

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