• 数据结构与算法冒泡排序


    本节我们说说常见的排序算法

    首先我们常见的排序算法有:

    一般排序:快速排序:其他排序:
    冒泡排序 快速排序 希尔排序
    选择排序 堆排序 技术排序
    插入排序 归并排序 技术排序

    首先从一般排序开始说起,介绍冒泡排序:

    定义:列表每两个相邻的数,如果前面比后面大,则交换这两个数,一趟排序完成后,无序区减少一个数,有序区增加一个数。

    上面的动画是冒泡排序的一趟,一趟以后在最后选出最大/最小的数,针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序),持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

    以下代码实现:

    1 #使用C++实现
    2 void bubble_sort(int arr[], int len) {
    3     int i, j;
    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                 swap(arr[j], arr[j + 1]);
    8 }
     1 #使用java实现
     2 public static void bubble_sort(int[] arr) {
     3         int i, j, temp, len = arr.length;
     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                 }

    首先我们要明白两件事:程序要执行多少趟,箭头要执行多少步,根据图片我们知道程序需要执行len(li)-1次,箭头执行len(li)-i-1;

    每一趟只能将一位数归位,所以如果有N个数进行排序,只需要将N-1个数归位,也就是说要进行N-1趟的操作,因为每次将一位数归位。所以箭头需要N-n(趟)-1。

    代码如下:

     1 # python
     2 def bubble_sort(li):
     3     for i in range(len(li)-1):
     4         for j in range(len(li)-i-1):
     5             if li[j] > li[j+1]:
     6                 #两个数交换
     7                 li[j] li[j+1] = li[j+1] li[J]
     8         print(li)
     9         
    10 li = [3,4,2,8,6,1]
    11 print(li)
    12 bunnle_sort(li)

    但是上面代码不是最优的,比如下面的操作:

    当我们进行了前三次的排列以后,其实列表已经排序好了,但是冒泡排序还是会继续执行该走的步骤,所以我们需要判断一下,

     1 # python
     2 def bubble_sort(li):
     3     for i in range(len(li)-1):
     4         exchange = False
     5         for j in range(len(li)-i-1):
     6             if li[j] > li[j+1]:
     7                 #两个数交换
     8                 li[j] li[j+1] = li[j+1] li[J]
     9                 #数交换则执行True
    10                 exchange = Ture
    11         print(li)
    12         if not exchange:
    13             return 
    14         
    15 li = [3,4,2,8,6,1]
    16 print(li)
    17 bunnle_sort(li)

    缺点:冒泡排序解决了桶排序浪费空间的问题,但是冒泡排序的效率特别低。

  • 相关阅读:
    五种提高 SQL 性能的方法
    join 使用详解方式
    关于MagicAjax的用法
    收藏几段SQL Server语句和存储过程
    ubuntu nfs配置 以及mount.nfs:access denied by server while mounting问题解决
    Hisi开发板上 SQLite3.3.8移植
    父进程非阻塞回收子进程(适用LINUX下C语言的clientserver模型)
    busybox asm/page.h: No such find.
    ubuntu11.10 samba服务器配置
    errno定义
  • 原文地址:https://www.cnblogs.com/xbhog/p/11741079.html
Copyright © 2020-2023  润新知