【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】

这篇具有很好参考价值的文章主要介绍了【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】,嵌入式 C 常用算法及函数,c语言,排序算法,算法

排序算法小结

C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。下面我们来一一介绍:

  • 冒泡排序(Bubble Sort):冒泡排序是通过比较相邻元素的大小进行排序。如果当前元素比下一个元素大,就交换它们两个的位置。重复这个过程直到最后,最大的元素就会“”到数组的最后。然后再从头开始重复这个过程,但是最后一个元素不再考虑。这个过程会一直进行,直到没有元素需要交换,也就是整个数组已经排序完成。冒泡排序需要两层for循环,所示它的时间复杂度是O(n^2)
  • 选择排序(Selection Sort):选择排序是每次从未排序的元素中选择最小(或最大)的元素放到未排序元素的开始位置,直到所有元素都已排序。选择排序的时间复杂度也是O(n^2)
  • 插入排序(Insertion Sort):插入排序的思路是将未排序的元素依次插入到已排序元素的适当位置。开始时,第一个元素被认为已排序,然后将第二个元素和它比较,决定第二个元素在已排序元素中的位置,然后再将第三个元素和已排序的元素比较,依次进行。插入排序的时间复杂度也是O(n^2)
  • 快速排序(Quick Sort):快速排序是一种使用分治策略的排序算法。它的基本思想是选择一个基准元素,将数组分为两部分,一部分的元素都比基准元素小,另一部分的元素都比基准元素大。然后对这两部分再分别进行快速排序。快速排序最坏的时间复杂度是O(n^2),但是在平均情况下,快速排序的时间复杂度是O(n log n)
  • 归并排序(Merge Sort):归并排序也是一种使用分治策略的排序算法。它的基本思想是将数组分为两半,分别对它们进行归并排序,然后将两个已排序的子数组合并成一个完整的已排序数组。归并排序的时间复杂度是O(n log n)
  • 堆排序(Heap Sort):堆排序是基于二叉堆的一种排序方法。首先将数组构建成一个最大堆或最小堆,然后依次移除堆顶的元素,并调整堆以保持堆的性质,直到堆为空,此时数组已排序。堆排序的时间复杂度是O(n log n)

总的来说,这些排序算法各有各的优点和适用场景,例如,冒泡排序、选择排序和插入排序适用于小规模数据或者部分有序数据,而快速排序、归并排序和堆排序通常适用于大规模数据排序。

排序算法C实现

冒泡排序算法

#include <stdio.h>

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 main(void)
{
	int arr[] = {2, 5, 6, 9, 3, 8, 1, 4, 7};
	
	bubbleSort(arr, sizeof(arr) / sizeof(arr[0]));

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	
	printf("%d", arr[i]);
}

由于冒泡排序算法过于简单,这里就不详细分析代码逻辑了,需要注意的是两层循环中循环次数的配置。

选择排序算法

void selectionSort(int arr[], int n)
{
    int i, j, minIndex, temp;

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

        temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}
  • void selectionsort(int arr[], int n) :这是一个名为 selectionsort 的函数,它接受一个整型数组和一个整数作为参数。整型数组是要被排序的数据,整数代表数组的长度。
  • int i, j, minindex, temp; :声明四个整型变量,i和j用于循环遍历,minindex用于保存当前最小元素的索引,temp用于交换元素。
  • for (i = 0; i < n-1; i++) :外层循环,用于遍历数组。由于选择排序是每次从未排序元素中选择最小(或最大)的元素放到已排序序列的末尾,所以只需要遍历到倒数第二个元素,最后一个元素自然就是最大(或最小)的。
  • minindex = i; :将当前遍历的元素索引赋值给 minindex,假设当前元素就是未排序元素中最小的。
  • for (j = i+1; j < n; j++) :内层循环,用于遍历i之后的所有元素,寻找真正的最小元素。
  • if (arr[j] < arr[minindex]) :如果找到一个元素小于当前最小元素,就更新最小元素。
  • minindex = j; :将新的最小元素的索引赋值给 minindex
  • temp = arr[minindex]; arr[minindex] = arr[i]; arr[i] = temp; :交换当前遍历的元素(arr[i])和最小元素(arr[minindex]),将最小元素放到已排序序列的末尾。

通过以上的步骤,整个数组经过n-1次遍历后,就会被排序完成。这就是选择排序的基本思想。

插入排序算法

void insertionSort(int arr[], int n)
{
    int i, key, j;

    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;
    }
}
  • void insertionsort(int arr[], int n):这是一个名为insertionsort的函数,它接受一个整型数组和一个整数作为参数。整型数组是要被排序的数据,整数用于表示数组的长度。
  • int i, key, j;:声明并初始化三个整型变量,ij用于循环遍历,key用于保存当前要插入的元素。
  • for (i = 1; i < n; i++):外层循环,用于遍历数组。由于插入排序的原理是将未排序的元素依次插入到已排序的数组中,因此从数组的第二个元素开始遍历。
  • key = arr[i];:保存当前要插入的元素。
  • j = i - 1;:j 用于遍历已排序的数组,从最后一个已排序的元素开始。
  • while (j >= 0 && arr[j] > key):内层循环,如果已排序的元素大于要插入的元素,就将已排序的元素向后移动。
  • arr[j + 1] = arr[j];:将大于要插入元素的值向后移动。
  • j = j - 1;:移动到已排序数组的前一个元素。
  • arr[j + 1] = key;:当已排序的元素不大于要插入的元素或已经没有元素可以比较时,就将要插入的元素放到正确的位置。

通过以上的步骤,整个数组经过n-1次遍历后,就会被排序完成。这就是插入排序的基本思想。

快速排序算法

int partition(int arr[], int low, int high)
{
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high- 1; j++) {
        if (arr[j] <= pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }

    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
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);
    }
}

归并排序算法

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

堆排序算法

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) {
        swap(&arr[i], &arr[largest]);
        heapify(arr, n, largest);
    }
}
void heapSort(int arr[], int n)
{
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    for (int i=n-1; i>=0; i--) {
        swap(&arr[0], &arr[i]);
        heapify(arr, i, 0);
    }
}

排序方法的稳定性

用某排序方法对一个关键码序列进行递增排序时,对于其中关键码相同的元素,若该方法可保证在排序前后这些元素的相对位置不变,则称该排序方法是稳定的。
【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】,嵌入式 C 常用算法及函数,c语言,排序算法,算法文章来源地址https://www.toymoban.com/news/detail-731761.html

到了这里,关于【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ARM 嵌入式 编译系列 10 -- GCC 编译缩减可执行文件 elf 文件大小】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍 下篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 在开发过程总,总是希望编译出来的可执行文件尽量小,因为这样可以节省更多的磁盘空间

    2024年02月09日
    浏览(31)
  • 嵌入式开发——ARM介绍

    ARM是一种芯片架构,由英国的ARM Holdings公司开发和授权,被广泛应用于各种嵌入式系统、移动设备和消费电子产品中。ARM架构被设计成低功耗、高性能、可定制化的特点,能够满足各种应用场景下的需求。 ARM架构主要设计了以下几个部分内容: 指令集架构 (Instruction Set Ar

    2024年02月04日
    浏览(40)
  • 嵌入式学习---ARM时钟体系

    按 一定电压幅度 , 一定时间间隔 连续发出的脉冲信号。它是一个周期性的信号,每个周期内包含一个上升沿和一个下降沿。时钟脉冲的上升沿和下降沿通常用于触发和同步各个电子元件的操作,例如CPU的指令执行、数据传输、寄存器更新等。 时钟频率是指时钟脉冲的频率

    2024年01月16日
    浏览(46)
  • 嵌入式:ARM Day6

    目的:1.输入\\\'a\\\',显示\\\'b\\\',将输入的字符的ASCII码下一位字符输出            2.原样输出输入的字符串 源码: uart4.h  uart4.c main.c 结果1: 结果2: 

    2024年02月12日
    浏览(33)
  • 嵌入式学习52-ARM1

    知识零散: 1.flash:                                                                                                                                                           nor flash    可被寻地址                                               

    2024年04月14日
    浏览(27)
  • 嵌入式:ARM Day4

     源码:         在上述代码中,int *ptr定义了一个指向整数类型的指针ptr,(int *)将地址0x5000A28强制转换为整数类型的指针,后续可以通过*ptr访问与修改该地址空间中的值。  

    2024年02月12日
    浏览(38)
  • ARM+LINUX嵌入式学习路线

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,

    2024年02月02日
    浏览(51)
  • 嵌入式系统——ARM架构及分类

      “架构”(Architecture)指的是功能规范,ARM架构即是ARM处理器的功能规范,包括以下主要内容: 指令集:每条指令的功能,指令在存储器中的表示方法(编码); 寄存器集:寄存器的数量、大小、功能,以及寄存器的初始状态; 异常模型:不同特权级、异常类型,以及采

    2024年02月02日
    浏览(49)
  • 嵌入式ARM设计编程(四) ARM启动过程控制

    文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 (1) 掌握建立基本完整的ARM 工程,包含启动代码,C语言程序等; (2) 了解ARM启动过程,学会编写简单的C 语言程序和汇编启动代码并进行

    2024年02月06日
    浏览(37)
  • 【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM

    板级支持包(BSP) 是商用嵌入式操作系统实现可移植性所采用的一种方案,是硬件抽象层的一种实现。BSP是介于硬件和操作系统中驱动层程序之间的一层,有时也可认为属于操作系统一部分。BSP实现了对操作系统的支持,为上层的驱动程序提供访问硬件设备的函数包。 BSP隔离了

    2024年04月17日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包