【数据结构--八大排序】之冒泡排序+选择排序+插入排序

简介: 文章目录一、冒泡排序1.原理:2.流程图:3.代码:4.测试结果:5.时间复杂度二、选择排序1.原理:2.流程图:3.代码:4.测试结果:5.时间复杂度

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤

📃个人主页 :阿然成长日记 👈点击可跳转

📆 个人专栏: 🔹数据结构与算法🔹C语言进阶

🚩 不能则学,不知则问,耻于问人,决无长进

🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

b9b144bf264d4e8993c86e8eac5348ab.png

一、冒泡排序

1.原理:

🔸每次从a]0]开始,从左到右,相邻元素依次进行比较。

🔸每比较完一轮,序列中最大的一个或最小的一个就被换到了数组最后的位置,数组下标-1。

🔸继续从头开始下一轮。

2.流程图:

a33c0382b1b14ac3b1890fd7a2f860af.gif

3.代码:

//冒泡排序
int* BubbleSort(int* a, int n)
{
  for (int i = 0; i < n - 1; i++)
  {
    for (int j = 0; j < n - i - 1; j++)
    {
      if (a[j + 1] < a[j])
      {
        int tmp = a[j + 1];
        a[j + 1] = a[j];
        a[j] = tmp;
      }
    }
  }
  return a;
}

4.测试结果:

5.时间复杂度

O(N^2)

二、选择排序

1.原理:

🔸 第一次选择a[0]元素,开始向后遍历同时找最大值,和最小值,最大值放到末尾,最小值放到开头。

🔸第二次选择a[1]元素,开始向后遍历同时找最大值,和最小值,最大值放到末尾,最小值放到开头,直到到end-1位置。

🔸重复上述操作

注意:如果max在beain位置,会造成排序错误,只需max = min即可;

2.流程图:

此流程图是在遍历时只找最小值的方法;

而我们选择优化这个排序,通过在遍历时同时寻找最大值和最小值,来提升排序效率。

image.gif

3.代码:

//选择排序
void SlectSort(int* a, int n)
{
  int begin = 0;
  int end = n - 1;
  while(begin<end)
  {
    int max = begin;
    int min = begin;
    for (int i = begin+1; i <= end; i++)
    {
      if (a[min] > a[i])
      {
        min = i;
      }
      if (a[max] < a[i])
      {
        max = i;
      }
    } 
    //先交换最小值到左边,
    Swap(&a[begin], &a[min]);
    //特殊情况。如果max在beain位置,会造成排序错误
    if (begin == max)
    {
      max = min;
    }
    //在交换最大值到右边
    Swap(&a[end], &a[max]);
    begin++;
    end--;
  }
}

4.测试结果:

5.时间复杂度

O(N^2)

三、直接插入排序

1.原理:

🔹>内循环: 每次取end+1下标位置值保存到tmp中,从end下标处向前作比较,如果比他小,就将该元素后移,如果大于或等于就停止,并将tmp值赋值给end+1位置,直到end小于0位置,

🔹>外循环:end++

2.流程图:

4ef03daddbdb4fb7b74fa7ded171c925.gif

3.代码:

//直接插入排序
int* InsetSort(int* a, int n)
{
  for (int i = 0; i < n - 1; i++)
  {
    int end = i;
    int tmp = a[end + 1];
    while (end >= 0)
    {
      if (tmp < a[end])
      {
        a[end + 1] = a[end];
      }
      else
      {
        break;
      }
      end--;
    }
    a[end + 1] = tmp;
  }
  return a;
}

4.测试结果:

5.时间复杂度

O(N^2)

相关文章
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
41 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
24 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
2月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
31 1
|
2月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
191 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
32 1
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
46 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
1月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
51 4