• 【C语言】常见的数据排序算法


    目录

    一、概述

    二、常见的排序算法

    2.1 冒泡排序

    2.1.1 定义

    2.1.2 C语言实现

    2.2 快速排序

    2.2.1 定义

    2.2.2 C语言实现

    2.3 插入排序

    2.3.1 定义

    2.3.2 C语言实现

    2.4 希尔排序

    2.4.1 定义

    2.4.2 C语言实现

    2.5 归并排序

    2.5.1 定义

    2.5.2 C语言实现

    2.6 基数排序

    2.6.1 定义

    2.6.2 C语言实现

    三、排序算法的空间、时间复杂度、稳定性


    一、概述

            排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。

    二、常见的排序算法

    2.1 冒泡排序

    2.1.1 定义

           冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复进行直到没有再需要交换的元素,这意味着数列已经排序完成。

    2.1.2 C语言实现

            这段代码首先定义了一个冒泡排序函数bubble_sort,它接受一个整型数组和数组的长度作为参数。然后定义了两个辅助函数print_array用于打印数组和main函数作为程序的入口。在main函数中,我们首先打印原始数组,然后调用冒泡排序函数进行排序,并再次打印排序后的数组。

    1. #include <stdio.h>
    2. void bubble_sort(int arr[], int len) {
    3. int i, j, temp;
    4. for (i = 0; i < len - 1; i++)
    5. for (j = 0; j < len - 1 - i; j++)
    6. if (arr[j] > arr[j + 1]) {
    7. temp = arr[j];
    8. arr[j] = arr[j + 1];
    9. arr[j + 1] = temp;
    10. }
    11. }
    12. void print_array(int arr[], int len) {
    13. int i;
    14. for (i = 0; i < len; i++)
    15. printf("%d ", arr[i]);
    16. printf("\n");
    17. }
    18. int main() {
    19. int arr[] = {64, 34, 25, 12, 22, 11, 90};
    20. int len = (int) sizeof(arr) / sizeof(*arr);
    21. printf("Original array: ");
    22. print_array(arr, len);
    23. bubble_sort(arr, len);
    24. printf("Sorted array: ");
    25. print_array(arr, len);
    26. return 0;
    27. }

    2.2 快速排序

    2.2.1 定义

            快速排序作为多种排序方法中效率最高的一种,其底层原理被广泛运用,他的核心思想与二叉树结构中的递归逻辑相似,首先标记一个元素作为基准点,然后利用该基准点把数组分成左右两个区间,并且使小于该基准点的元素放在左区间,大于该基准点的元素放在右区间,如此反复递归,直到数组为一个有序数组。

    2.2.2 C语言实现

            这段代码首先定义了一个辅助函数swap用于交换数组中的元素。然后定义了partition函数来选择一个基准点并重新排列数组,使得比基准点小的元素都在它的左侧,比基准点大的元素都在它的右侧。最后,quickSort函数递归地对数组的左右部分进行排序。printArray函数用于打印排序后的数组。在main函数中,我们定义了一个数组并对它进行排序,然后打印排序结果。

    1. #include <stdio.h>
    2. void swap(int* a, int* b) {
    3. int t = *a;
    4. *a = *b;
    5. *b = t;
    6. }
    7. int partition (int arr[], int low, int high) {
    8. int pivot = arr[high];
    9. int i = (low - 1);
    10. for (int j = low; j <= high - 1; j++) {
    11. if (arr[j] < pivot) {
    12. i++;
    13. swap(&arr[i], &arr[j]);
    14. }
    15. }
    16. swap(&arr[i + 1], &arr[high]);
    17. return (i + 1);
    18. }
    19. void quickSort(int arr[], int low, int high) {
    20. if (low < high) {
    21. int pi = partition(arr, low, high);
    22. quickSort(arr, low, pi
  • 相关阅读:
    java常量命名规则简介说明
    Spring IOC源码研究笔记(2)——ApplicationContext系列
    动手学深度学习——求导
    极客日报:达摩院实现全球最大AI预训练模型;苹果3nm芯片或将2023年问世;微软官宣加入JCP计划
    SpringMVC跳转
    spring
    python与深度学习【初步尝试】
    【21天学习挑战赛】折半查找
    未能为 SSL/TLS 安全通道建立信任关系
    ROS1 and ROS2一键安装
  • 原文地址:https://blog.csdn.net/xiaoyingxixi1989/article/details/139960918