帮助快速理解上手冒泡排序

简介: 帮助快速理解上手冒泡排序

 目录

前言

经典冒泡排序

冒泡排序的优化:


前言

对初学者来说,冒泡排序是很难理解的一个点,那么希望这篇文章可以对你理解冒泡排序有所帮助

经典冒泡排序

题目:给定一串数字,进行由大到小的排序


算法:令数组中的前两个数字进行大小比较,看作为左右两个数,进行大小比较后使得数字较大的数字始终在右边的位置,下一轮比较时再让这个数字和右边的数字继续比较,依次比较直到这串数组的最后一个字符,这样我们就能通过这一操作让这串字符串中最大的一个数字放到字符串的最后一个位置,这样就完成了一趟,其余数字依次进行即可

以下为完整代码:


#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
  int temp = 0;
  int i, j;
  for (i = 0; i < sz - 1; i++)
  {
    for (j = 0; j < sz - 1 - i; j++)
    if (arr[j] > arr[j + 1])
    {
    temp = arr[j+1];
     arr[j + 1] = arr[j];
     arr[j] = temp;
    }
  }
}
int main()
{
  int arr[] = {10,9,8,7,6,5,4,3,2,1};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  bubble_sort(arr, sz);
//数组传参只会传首地址,即&arr[0],所以要提前传递sz
  for (i = 0; i < sz; i++)
  printf("%d ", arr[i]);
  printf("\n");
  return 0;
}

image.gif


在实际比较中会遇见这样的情况,如果给定的数组是9 1 2 3 4 5 6 7 8,那么实际上我们只需要进行一次循环就已经排序完成了,若运行上述程序还会接着进行循环,直到最后一个数字被比较

我们可以对程序略加优化:我们可以引入一个flag的变量,当左边的数字大于右边时会进入循环,此时flag会变成0,当结束这一趟循环时flag又会被赋为1,若接下来的数字没有进入if循环,则说明已经不再需要后续比较了,此时flag仍为1,那么我们就可以直接break跳出循环,这样可以作为一个优化


冒泡排序的优化:

以下为优化后的结果:

int main()
{
    int a[10], i, j, n;
    printf("输入10个数:");
    for (i = 1; i <= 10; i++)
        scanf("%d", &a[i]);
    for (i = 1; i <= 10; i++)
        for (j = i; j <= 10; j++)
        {
            if (a[i] > a[j])
            {
                n = a[i];
                a[i] = a[j];
                a[j] = n;
            }
        }
    printf("该十个数升序为: ");
    for (i = 1; i <= 10; i++)
        printf("%2d", a[i]);
}
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
  int temp = 0;
  int i, j;
  for (i = 0; i < sz - 1; i++)
  {
    int flag = 1;
    for (j = 0; j < sz - 1 - i; j++)
    if (arr[j] > arr[j + 1])
    {
    temp = arr[j+1];
     arr[j + 1] = arr[j];
     arr[j] = temp;
     flag = 0;
    }
    if (flag == 1)//对代码进行优化,如果已经达到顺序则不再进行排序
      break;
  }
}
int main()
{
  int arr[] = {10,9,8,7,6,5,4,3,2,1};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  bubble_sort(arr, sz);
//数组传参只会传首地址,即&arr[0],所以要提前传递sz
  for (i = 0; i < sz; i++)
  printf("%d ", arr[i]);
  printf("\n");
  return 0;
}

image.gif


相关文章
|
7月前
|
搜索推荐
排序算法笔记
排序算法笔记
47 0
|
6月前
|
搜索推荐 算法 大数据
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
|
7月前
|
搜索推荐
直接选择排序:最通俗易懂的排序算法
直接选择排序:最通俗易懂的排序算法
55 1
|
7月前
|
搜索推荐 算法
常见排序算法以及冒泡排序的基础使用方法
常见排序算法以及冒泡排序的基础使用方法
44 0
|
Web App开发 算法 前端开发
前端排序算法实现
前端排序算法实现
79 0
|
前端开发
前端学习案例1-选择排序
前端学习案例1-选择排序
38 0
前端学习案例1-选择排序
|
前端开发
前端知识案例-冒泡排序
前端知识案例-冒泡排序
74 0
前端知识案例-冒泡排序
|
前端开发
前端知识案例-归并排序
前端知识案例-归并排序
59 0
前端知识案例-归并排序
|
搜索推荐 数据可视化 Java
【笔记16】排序算法:冒泡排序
排序:把一串没有按照顺序排列的数按照升序或降序排列。 排序前:1、6、2、7、8、3、9、5、4 升序:1、2、3、4、5、6、7、8、9 降序:9、8、7、6、5、4、3、2、1
151 0
【笔记16】排序算法:冒泡排序
|
搜索推荐 Python
Python编程:排序算法之冒泡排序
Python编程:排序算法之冒泡排序
163 0
Python编程:排序算法之冒泡排序