C语言所有经典排序方法的实现代码

C语言所有经典排序方法的实现代码

本文将会讲解C语言中所有经典的排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序,并提供完整的代码实现。

冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

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

选择排序

选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序的数列中找到最小的元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小的元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

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

插入排序

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常会采用in-place排序(即只需用到O(1)的额外空间的排序)。

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

快速排序

快速排序是冒泡排序的一种改进。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分:分区(partition),左边的所有元素都比右边的所有元素小,然后再按此方法对这两部分分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目标。

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}
int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);
    int j;
    for (j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
    return i + 1;
}

归并排序

归并排序是建立在归并操作上的一种有效的排序算法。它将待排序的序列分为若干个子序列,然后每个子序列都排序,最后再将已排序的子序列合并成为最终序列。

void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}
void merge(int arr[], int l, int m, int r) {
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;
    int L[n1], R[n2];
    for (i = 0; i < n1; i++) {
        L[i] = arr[l + i];
    }
    for (j = 0; j < n2; j++) {
        R[j] = arr[m + 1 + j];
    }
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

堆排序

堆排序是一种选择排序,它的基本思想就是:将待排序序列构造成一个大(小)顶堆,此时整个序列的最大(最小)值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就是最大(或最小)值。然后将剩余 n - 1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序序列了。

void heapSort(int arr[], int n) {
    int i;
    for (i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    for (i = n - 1; i >= 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}
void heapify(int arr[], int n, int i) {
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    if (l < n && arr[l] > arr[largest]) {
        largest = l;
    }
    if (r < n && arr[r] > arr[largest]) {
        largest = r;
    }
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}

以上就是C语言中所有经典排序算法的实现代码。接下来我们就可以根据不同的数据特点,选择不同的排序算法,进行排序操作,使得数据能以合理、高效的方式得到排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言所有经典排序方法的实现代码 - Python技术站

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

相关文章

  • java15新功能的详细讲解

    Java 15 新功能的详细讲解攻略 简介 Java 15 是 Java 编程语言的最新版本,于 2020 年 9 月发布。它包含了多项新增功能和改进,如 ZGC 改进、密封类、预览特性、记录类型等。 本攻略将详细介绍 Java 15 的新功能,以及如何使用这些新功能来提高开发人员的效率以及增强代码可读性。 密封类 Java 15 引入了密封类(sealed…

    C 2023年5月23日
    00
  • SIGPIPE(Signal 13, Code 0) 异常排查及处理

    SIGPIPE(Signal 13, Code 0) 异常排查及处理 什么是 SIGPIPE SIGPIPE 是指在一个进程(或线程)向另一个进程(或线程)发送数据的时候,如果对方已经关闭了对应的 pipe、socket 或 FIFO 等管道,那么发送数据的进程就会收到 SIGPIPE 信号,这个信号的默认行为是进程终止。通常情况下,这个信号是由于进程发送数…

    C 2023年5月23日
    00
  • C程序 计算自然数之和

    让我为您详细讲解如何使用“C程序 计算自然数之和”。 什么是C程序 计算自然数之和 “C程序 计算自然数之和”是一段使用C语言编写的程序,它可以计算从1到N的所有自然数之和,并将结果输出到屏幕上。该程序能够帮助学习C语言的初学者熟悉基础语法和算法思想。 如何使用C程序 计算自然数之和 使用C程序 计算自然数之和非常简单,您只需要按照以下步骤进行操作即可。 1…

    C 2023年5月10日
    00
  • Python Json序列化与反序列化的示例

    下面是关于“Python Json序列化与反序列化的示例”的完整攻略。 Json序列化与反序列化 什么是Json Json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。Json使用纯文本表示结构化数据,可被所有编程语言读取和理解。 Json序列化 Json序列化是指将一个对象…

    C 2023年5月23日
    00
  • Golang校验字符串是否JSON格式的方法总结

    当我们使用Golang进行Web开发时,经常需要对前端提交的数据进行JSON格式校验,以保证数据的正确性和数据传输的安全性。下面是针对Golang校验字符串是否JSON格式的方法总结的详细攻略。 方法一:使用json.Unmarshal()函数校验 使用Golang标准库中的json.Unmarshal()函数,可以直接将JSON格式的规范化字符串解析成JS…

    C 2023年5月23日
    00
  • Qt数据库应用之实现通用数据库请求

    下面是详细的讲解“Qt数据库应用之实现通用数据库请求”的完整攻略: 什么是通用数据库请求 通用数据库请求是指一种可以适用于多种不同类型数据库的请求方式,通过统一的接口访问多种数据库,能够大大提高开发效率。在 Qt 中,可以通过 QSqlQuery 和 QSqlDatabase 类来实现通用数据库请求。 实现通用数据库请求的步骤 创建数据库连接:使用 QSql…

    C 2023年5月22日
    00
  • C语言实现五子棋小游戏

    C语言实现五子棋小游戏攻略 1. 环境准备 在开始编写五子棋小游戏前,需要先确定所用的开发工具以及环境。 1.1 开发工具 可以使用任何一种 C 语言开发工具,如 Visual Studio、Code::Blocks、Dev-C++等。本攻略以 Code::Blocks 为例进行讲解。 1.2 环境配置 安装 Code::Blocks 后,需要进行一些环境配…

    C 2023年5月23日
    00
  • 总结UNIX/LINUX下C++程序计时的方法

    下面是关于“总结UNIX/LINUX下C++程序计时的方法”的完整攻略。 1.使用clock()函数计时 在UNIX/LINUX下,可以使用clock()函数对C++程序进行计时。clock()函数的单位是CPU时钟数(clock ticks),其返回值为程序运行时间(单位为10^(-6)秒)。在<ctime>头文件中定义了该函数。 下面是一段示…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部