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语言实现冒泡排序,选择排序,快速排序

    首先我们来讲一下三种基本的排序算法——冒泡排序、选择排序和快速排序,并且给出实现的具体代码。 冒泡排序 冒泡排序是一个非常简单的排序算法,其基本思想是比较相邻两个数的大小,如果前一个数比后一个数大,就将两个数交换位置。通过不断重复这个过程,将最大的数“冒泡”到数组的最后面,这个过程类似于水泡在水中不断冒上来,因此得其名。 具体的实现代码如下: void bu…

    算法与数据结构 2023年5月19日
    00
  • C#中使用快速排序按文件创建时间将文件排序的源码

    下面就来详细讲解如何在C#中使用快速排序按文件创建时间将文件排序的源码攻略。 1. 快速排序原理 快速排序(Quick Sort)是一种基于分治法的高效排序算法,其主要思想是选择一个基准点(pivot),将数组分为左右两个子数组,将左边的数组的元素都小于基准点,右边的数组的元素都大于基准点,再递归对左右子数组进行快排操作,直到子数组长度为1或0。快速排序的时…

    算法与数据结构 2023年5月19日
    00
  • JS实现随机化快速排序的实例代码

    下面是JS实现随机化快速排序的完整攻略。 什么是随机化快速排序 随机化快速排序是一个常用的排序算法,它能够在 $O(n \log n)$ 的时间复杂度下对一个数组进行排序。该算法的实现非常高效,因为它使用了分治的思想,并且使用的是原地排序,即不需要额外的存储空间。随机化快速排序的核心是分区(partition)操作,该操作能够将一个数组分成两个部分,一部分是…

    算法与数据结构 2023年5月19日
    00
  • PHP两种快速排序算法实例

    下面是对PHP两种快速排序算法实例的详细讲解: 1. 快速排序算法介绍 快速排序属于交换排序的一种,是目前应用最广泛的排序算法之一,也是学习算法的重要内容。快速排序算法的基本思想是通过将待排序序列进行划分,并不断递归对子序列进行排序,完成整个序列的排序。 快速排序的基本步骤如下: 选择一个基准值(pivot)。 将待排序数组中小于基准值的元素移动到数组左侧,…

    算法与数据结构 2023年5月19日
    00
  • PHP实现批量检测网站是否能够正常打开的方法

    以下是详细讲解“PHP实现批量检测网站是否能够正常打开的方法”的完整攻略: 步骤一:获取待检测的网站列表 首先我们需要准备一个文本文件,里面包含了我们需要检测的网站列表。每一行应该包含一个网站的URL地址,如下所示: https://www.google.com http://www.baidu.com http://www.github.com 注意:每个…

    算法与数据结构 2023年5月19日
    00
  • PHP快速排序算法实现的原理及代码详解

    下面我就详细讲解一下“PHP快速排序算法实现的原理及代码详解”的完整攻略。 一、快速排序算法的原理 快速排序(Quicksort)是非常常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的记录关键字小,然后分别对这两部分记录继续进行排序,重复上述过程,直到整个序列有序为止。 具体流程如下: 从数列中挑出一…

    算法与数据结构 2023年5月19日
    00
  • c#实现最简洁的快速排序(你绝对可以看懂)

    下面我将详细讲解“c#实现最简洁的快速排序(你绝对可以看懂)”的完整攻略。 1、什么是快速排序? 快速排序是一种常用的排序算法,其思想是将一个数组划分为两个子数组,然后分别对这两个子数组进行排序。通过不断地递归调用这个过程,最终得到有序的数组。 2、快速排序的步骤 下面是快速排序的步骤: 选择一个基准值(pivot),一般选择数组中的第一个元素。 定义两个指…

    算法与数据结构 2023年5月19日
    00
  • MySQL order by与group by查询优化实现详解

    MySQL的order by与group by是常用的查询优化手段,本篇攻略将详细讲解order by与group by的使用方法及其优化实现。 1. MySQL Order By MySQL Order By 用于对查询结果进行排序,将查询结果按照指定字段的顺序进行排列 ,默认升序排序,也可以指定为降序排序。 SELECT column1, column2…

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