【C语言】十大经典排序代码及GIF演示

news2025/1/11 5:54:32

🔥🔥🔥专栏推荐:C语言基础语法🔥🔥🔥


十大经典排序代码

  • 1. 冒泡排序
  • 2. 选择排序
  • 3. 插入排序
  • 4. 快速排序
  • 5. 归并排序
  • 6. 堆排序
  • 7. 希尔排序
  • 8. 计数排序
  • 9. 桶排序
  • 10. 基数排序


1. 冒泡排序


请添加图片描述


  • 通过依次比较相邻的两个元素,将较大(小)的元素向后(前)移动,实现排序。时间复杂度为O(n2),空间复杂度为O(1),适用于数据量较小的排序。

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;
            }
        }
    }
}

冒泡排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

8,5,3,6,9,2,1,0,4,7,10

第二轮:

5,3,6,8,2,1,0,4,7,9,10

第三轮:

3,5,6,2,1,0,4,7,8,9,10

第四轮:

3,5,2,1,0,4,6,7,8,9,10

第五轮:

3,2,1,0,4,5,6,7,8,9,10

第六轮:

2,1,0,3,4,5,6,7,8,9,10

第七轮:

1,0,2,3,4,5,6,7,8,9,10

第八轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:简单易懂,代码实现容易。
  • 缺点:效率较低,时间复杂度为O(n2)。
  • 时间复杂度:最好情况O(n),最坏情况O(n2),平均情况O(n2)。
  • 空间复杂度:O(1)。
  • 适用范围:数据规模较小的情况下。
  • 实际应用实例:对学生按照成绩进行排序。

2. 选择排序


请添加图片描述


  • 从未排序的序列中选择最小(大)的元素,放到已排序的序列的末尾,实现排序。时间复杂度为O(n2),空间复杂度为O(1),适用于数据量较小的排序。

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

选择排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

0,5,3,6,9,10,2,1,8,4,7

第二轮:

0,1,3,6,9,10,2,5,8,4,7

第三轮:

0,1,2,6,9,10,3,5,8,4,7

第四轮:

0,1,2,3,9,10,6,5,8,4,7

第五轮:

0,1,2,3,4,10,6,5,8,9,7

第六轮:

0,1,2,3,4,5,6,10,8,9,7

第七轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:比冒泡排序更快,实现简单。
  • 缺点:效率仍然较低,不稳定。
  • 时间复杂度:最好情况O(n2),最坏情况O(n2),平均情况O(n2)。
  • 空间复杂度:O(1)。
  • 适用范围:数据规模较小的情况下。
  • 实际应用实例:对商品按照价格进行排序。

3. 插入排序


请添加图片描述


  • 将未排序的元素插入到已排序的序列中,实现排序。时间复杂度为O(n2),空间复杂度为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--;
        }
        arr[j+1] = key;
    }
}

插入排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

5,8,3,6,9,10,2,1,0,4,7

第二轮:

3,5,8,6,9,10,2,1,0,4,7

第三轮:

3,5,6,8,9,10,2,1,0,4,7

第四轮:

2,3,5,6,8,9,10,1,0,4,7

第五轮:

1,2,3,5,6,8,9,10,0,4,7

第六轮:

0,1,2,3,5,6,8,9,10,4,7

第七轮:

0,1,2,3,4,5,6,8,9,10,7

第八轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:对于小规模数据排序效率高,稳定。
  • 缺点:数据规模较大时效率明显下降。
  • 时间复杂度:最好情况O(n),最坏情况O(n2),平均情况O(n2)。
  • 空间复杂度:O(1)。
  • 适用范围:数据规模较小的情况下。
  • 实际应用实例:对一段英文文本进行排序。

4. 快速排序


请添加图片描述


  • 通过选定一个基准元素,将序列分为左右两个部分,左边的元素都小于(大于)基准元素,右边的元素都大于(小于)基准元素,递归实现排序。时间复杂度为O(nlogn),空间复杂度为O(logn),适用于大数据量的排序。

void quickSort(int arr[], int low, int high) {
    if (low < 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;
        int pi = i + 1;
        quickSort(arr, low, pi-1);
        quickSort(arr, pi+1, high);
    }
}

快速排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

4,5,3,6,9,10,2,1,0,8,7

第二轮:

0,1,2,3,4,5,6,9,8,10,7

第三轮:

0,1,2,3,4,5,6,7,8,10,9


  • 优点:效率高,是所有O(nlogn)排序中最快的。
  • 缺点:不稳定,对于数据规模较小的情况下效率不如插入排序。
  • 时间复杂度:最好情况O(nlogn),最坏情况O(n2),平均情况O(nlogn)。
  • 空间复杂度:最好情况O(logn),最坏情况O(n),平均情况O(logn)。
  • 适用范围:数据规模较大的情况下,排序效率高。
  • 实际应用实例:对大规模数据进行排序。

5. 归并排序


请添加图片描述


  • 将序列分为若干个子序列,将相邻的子序列进行合并,递归实现排序。时间复杂度为O(nlogn),空间复杂度为O(n),适用于大数据量的排序。

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++;
    }
}

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);
    }
}

归并排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

3,5,6,8,9,10,0,1,2,4,7

第二轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,稳定。
  • 缺点:空间复杂度较高。
  • 时间复杂度:最好情况O(nlogn),最坏情况O(nlogn),平均情况O(nlogn)。
  • 空间复杂度:O(n)。
  • 适用范围:数据规模较大的情况下,排序效率高。
  • 实际应用实例:对大规模数据进行排序。

6. 堆排序


请添加图片描述


  • 将序列构建成一个堆,将堆顶元素取出放到已排序的序列的末尾,然后重新调整堆,递归实现排序。时间复杂度为O(nlogn),空间复杂度为O(1),适用于大数据量的排序。

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);
    }
}

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);
    }
}

堆排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

10,9,3,6,8,5,2,1,0,4,7

第二轮:

9,8,3,6,7,5,2,1,0,4,10

第三轮:

8,7,3,6,4,5,2,1,0,9,10

第四轮:

7,4,3,6,0,5,2,1,8,9,10

第五轮:

6,4,3,1,0,5,2,7,8,9,10

第六轮:

5,4,3,1,0,2,6,7,8,9,10

第七轮:

4,2,3,1,0,5,6,7,8,9,10

第八轮:

3,2,0,1,4,5,6,7,8,9,10

第九轮:

2,1,0,3,4,5,6,7,8,9,10

第十轮:

1,0,2,3,4,5,6,7,8,9,10

第十一轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,不占用额外空间。
  • 缺点:不稳定。
  • 时间复杂度:最好情况O(nlogn),最坏情况O(nlogn),平均情况O(nlogn)。
  • 空间复杂度:O(1)。
  • 适用范围:数据规模较大的情况下,排序效率高。
  • 实际应用实例:对大规模数据进行排序。

7. 希尔排序


请添加图片描述


  • 将序列分为若干个子序列,对每个子序列进行插入排序,逐步缩小子序列的长度,最后对整个序列进行插入排序,实现排序。时间复杂度为O(nlogn)~O(n2),空间复杂度为O(1),适用于大数据量的排序。

void shellSort(int arr[], int n) {
    int gap, i, j, temp;
    for (gap = n/2; gap > 0; gap /= 2) {
        for (i = gap; i < n; i++) {
            temp = arr[i];
            for (j = i; j >= gap && arr[j-gap] > temp; j -= gap) {
                arr[j] = arr[j-gap];
            }
            arr[j] = temp;
        }
    }
}

希尔排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

第一轮:

4,1,3,0,7,6,2,5,9,10,8

第二轮:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,相对于其他O(nlogn)排序算法,希尔排序在数据规模较小的情况下也可以表现出色。
  • 缺点:不稳定。
  • 时间复杂度:最好情况O(nlogn),最坏情况O(n2),平均情况O(n1.3)。
  • 空间复杂度:O(1)。
  • 适用范围:对数据规模较小的情况下也可以表现出色。
  • 实际应用实例:对一段英文文本进行排序。

8. 计数排序


请添加图片描述


  • 计序列中每个元素出现的次数,将统计结果进行累加,得到每个元素在有序序列中的位置,逐个将元素放到有序序列中,实现排序。时间复杂度为O(n+k),空间复杂度为O(k),适用于元素范围不大的排序。

void countingSort(int arr[], int n) {
    int max = arr[0];
    int i, j;
    for (i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    int count[max+1];
    for (i = 0; i <= max; i++) {
        count[i] = 0;
    }
    for (i = 0; i < n; i++) {
        count[arr[i]]++;
    }
    for (i = 1; i <= max; i++) {
        count[i] += count[i-1];
    }
    int output[n];
    for (i = n-1; i >= 0; i--) {
        output[count[arr[i]]-1] = arr[i];
        count[arr[i]]--;
    }
    for (i = 0; i < n; i++) {
        arr[i] = output[i];
    }
}

计数排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,稳定。
  • 缺点:只适用于非负整数排序。
  • 时间复杂度:最好情况O(n+k),最坏情况O(n+k),平均情况O(n+k)。
  • 空间复杂度:O(k)。
  • 适用范围:数据规模较小,且数据集合中最大数值较小的情况下。
  • 实际应用实例:对一段英文文本中字符出现频率进行排序。

9. 桶排序


请添加图片描述


  • 将序列中的元素分配到若干个桶中,对每个桶中的元素进行排序,最后依次取出每个桶中的元素,实现排序。时间复杂度为O(n+k),空间复杂度为O(n+k),适用于元素范围分布比较均匀的排序。
void bucketSort(float arr[], int n) {
    vector<float> b[n];
    int i, j;
    for (i = 0; i < n; i++) {
        int bi = n * arr[i];
        b[bi].push_back(arr[i]);
    }
    for (i = 0; i < n; i++) {
        sort(b[i].begin(), b[i].end());
    }
    int index = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < b[i].size(); j++) {
            arr[index++] = b[i][j];
        }
    }
}

桶排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,稳定。
  • 缺点:需要占用额外的空间。
  • 时间复杂度:最好情况O(n+k),最坏情况O(n2),平均情况O(n)。
  • 空间复杂度:O(n+k)。
  • 适用范围:数据规模较大,数据集合中数值分布较均匀的情况下。
  • 实际应用实例:对大规模数据进行排序。

10. 基数排序


请添加图片描述


  • 将序列中的元素按照位数进行排序,从低位到高位依次排序,最终得到有序序列。时间复杂度为O(d(n+k)),空间复杂度为O(n+k),适用于元素位数较小的排序。

int getMax(int arr[], int n) {
    int max = arr[0];
    int i;
    for (i = 1; i < n; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

void countSort(int arr[], int n, int exp) {
    int output[n];
    int i, count[10] = {0};
    for (i = 0; i < n; i++) {
        count[(arr[i]/exp)%10]++;
    }
    for (i = 1; i < 10; i++) {
        count[i] += count[i-1];
    }
    for (i = n-1; i >= 0; i--) {
        output[count[(arr[i]/exp)%10]-1] = arr[i];
        count[(arr[i]/exp)%10]--;
    }
    for (i = 0; i < n; i++) {
        arr[i] = output[i];
    }
}

void radixSort(int arr[], int n) {
    int m = getMax(arr, n);
    int exp;
    for (exp = 1; m/exp > 0; exp *= 10) {
        countSort(arr, n, exp);
    }
}

基数排序对{8,5,3,6,9,10,2,1,0,4,7}进行排序

排序过程展示:

0,1,2,3,4,5,6,7,8,9,10


  • 优点:效率高,稳定。
  • 缺点:只适用于非负整数排序,不适合数据范围很大的情况。
  • 时间复杂度:最好情况O(d(n+k)),最坏情况O(d(n+k)),平均情况O(d(n+k))。
  • 空间复杂度:O(n+k)。
  • 适用范围:数据规模较大,数据集合中数值位数较少的情况下。
  • 实际应用实例:对学生按照学号进行排序。

🔥🔥🔥专栏推荐:C语言基础语法🔥🔥🔥


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQ 服务占用 CPU 太高

文章目录 MQ 服务占用 CPU 太高1. 出现问题2. 分析过程1. 通过日志定位问题服务2. 查询异常服务进程、CPU、内存、IO、锁和网络3. CPU 占用过高分析 3. 解决方案 MQ 服务占用 CPU 太高 1. 出现问题 测试环境中&#xff0c;匹配业务运行时会出现响应缓慢或超时失败的情况 2. …

继承的相关介绍---C++

一、概念及定义 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结…

复现CVE-2023-21839

攻击机安装jdk1.8 下载jdk1.8 https://www.azul.com/downloads/?versionjava-8-lts&osubuntu&architecturex86-64-bit&packagejdk#zulu 或 wget https://cdn.azul.com/zulu/bin/zulu8.60.0.21-ca-jdk8.0.372-linux_x64.tar.gz tar -zxvf zulu8.60.0.21-ca-jdk8.…

GB/T 28181-2011、2016、2022变更对比

一、GB/T 28181-2016与GB/T 28181-2011变更对比 GB/T 28181-2016与GB/T 28181-2011相比&#xff0c; 除编辑性修改外主要技术变化如下&#xff1a; ----(1) 修改了标准名称&#xff1b; ----(2) 增加了媒体流TCP传输要求(见4.3.1&#xff0c; 5.2&#xff0c;附录F&#xff…

Ubuntu磁盘和目录和文件的相关操作

目录 1、目录的切换 2、查看目录及文件 3、目录的常见操作 4、文件的常见操作 5、查看文件及目录大小 6、命令查看硬盘信息 1、目录的切换 打开终端窗口&#xff08;”ctrlaltt“&#xff09; 一般使用&#xff08;”pwd“&#xff09;显示当前所在的目录 比如&#x…

【用python的QT做信号处理的界面】

文章目录 入口文件界面参数调整数据从dat解析出来的文件从界面点击打开文件夹的功能实现主要功能代码网络参数存图替换功能&#xff0c;比如把倒频谱替换成倒频谱2 入口文件 入口文件&#xff0c;主要用来实例化窗口&#xff08;不重要&#xff09;&#xff0c;只要知道从这里…

电脑中病毒了怎么修复,计算机Windows系统预防faust勒索病毒方法

随着计算机系统的不断发展&#xff0c;我们所面对的网络安全威胁也变得越来越严重。其中&#xff0c;较为常见且危险的威胁就是勒索病毒。随着勒索病毒加密算法的不断升级&#xff0c;最近faust勒索病毒开始流行。Faust勒索病毒主要的攻击目标是Windows操作系统&#xff0c;一旦…

SpringBoot手册

目录 依赖管理关于各种的 start 依赖关于自动配置关于约定大于配置中的配置SpringBoot 整合 SpringMVC定制化 SpringMVC静态资源处理对上传文件的处理对异常的处理Web原生组件注入&#xff08;Servlet、Filter、Listener&#xff09;Interceptor 自定义拦截器DispatcherServlet…

【iOS】GCD学习

GCD的概念 GCD&#xff08;Grand Central Dispatch&#xff09;&#xff0c;是有Apple公司开发的一个多核编程的解决方案&#xff0c;用以优化应用程序支持多核处理器&#xff0c;是基于线程模式之上执行并发任务。 GCD的优点 利用设备多核进行并行运算GCD自动充分使用设备的…

C语言-学习之路-03

C语言-学习之路-03 程序流程结构选择结构if语句if...else...语句三目运算符switch语句 循环结构while语句do...while语句for语句嵌套循环 跳转语句break、continue、gotobreak语句continue语句goto语句 程序流程结构 C语言支持最基本的三种程序流程结构&#xff1a;顺序结构、…

三、SpringMVC

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体…

REST API 详解

REST API REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;是一种用于构建分布式系统的架构风格。REST API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一种基于REST风格的网络API&#xff…

Filter 过滤器

Filter过滤器介绍 这里我们讲解Filter的执行流程&#xff0c;从下图可以大致了解到&#xff0c;当客户端发送请求的时候&#xff0c;会经过过滤器&#xff0c;然后才能到我们的servlet&#xff0c;当我们的servlet处理完请求之后&#xff0c;我们的response还是先经过过滤器才…

Packet Tracer - 配置交换机端口安全

Packet Tracer - 配置交换机端口安全 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 10.10.10.2 255.255.255.0 PC1 NIC 10.10.10.10 255.255.255.0 PC2 NIC 10.10.10.11 255.255.255.0 非法笔记本电脑 NIC 10.10.10.12 255.255.255.0 目标 第 1 部…

MySQL监控告警及可视化:Zabbix+Percona PMP实现(Part I)

MySQL监控告警及可视化&#xff1a;ZabbixPercona PMP实现&#xff08;Part I&#xff09; 准备工作Zabbix Server安装Zabbix Server配置conf文件配置系统服务配置Web服务配置 Zabbix Agent安装Zabbix Agent配置conf文件配置系统服务配置 准备工作 &#x1f42c;软件下载&#…

ChatGPT提示词工程(五):Transforming转换

目录 一、说明二、安装环境三、转换&#xff08;Transforming&#xff09;1. 翻译 Translation2. 语气转换 Tone Transformation3. 格式转换 Format Conversion4. 拼写或语法检查 Spellcheck/Grammar check 一、说明 这是吴恩达 《ChatGPT Prompt Engineering for Developers》…

kubernetes安全框架RBAC

目录 一、Kubernetes 安全概述 二、鉴权、授权和准入控制 2.1 鉴权(Authentication) 2.2 授权(Authorization) 2.3 准入控制 三、基于角色的权限访问控制&#xff1a; RBAC 四、案例&#xff1a;为指定用户授权访问不同命名空间权限 一、Kubernetes 安全概述 K8S安全控…

YOLOv5 txt标签转图像标签(多个标签)

Python YOLOv5 txt标签转图像标签&#xff08;多个标签 txt的数据如图所示1.读原始图像以及对应的txt文件2.获得原始图像的大小3.生成一张大小相同&#xff0c;黑色背景的图片4.读取txt文件&#xff0c;循环的增加标签5.获得不规则图形&#xff08;标签&#xff09;6.完整代码7…

Linux运维:makefile

一.makefile 1.makefile介绍 Makefile 是一种用于自动化构建的文件&#xff0c;它描述了一个软件项目的编译规则和依赖关系&#xff0c;并提供了一些工具来自动执行这些规则。 Makefile 的主要作用如下&#xff1a; 自动化编译&#xff1a;通过 Makefile&#xff0c;可以定…

使用 nvcc 的时候出现“helper_cuda.h”: No such file or directory错误该怎么办(其他xxx.h也是同样的解决方法)

今天在命令行中使用nvcc的时候&#xff0c;出现了“helper_cuda.h”: No such file or directory错误。这个错误信息表示&#xff1a;在编译的时候&#xff0c;找不到helper_cuda.h头文件&#xff08;其他xxx.h如果也找不到&#xff0c;那么下面的解释和解决方法也通用&#xf…