zoukankan      html  css  js  c++  java
  • 数据结构与算法冒泡排序

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

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

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

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

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

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

    以下代码实现:

    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)

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

  • 相关阅读:
    std::erase总结
    C++控制台应用程序运行控制台闪退
    判断当前进程是否已经打开C++
    获取当前系统语言C++
    VS中设置Qt多语言界面
    QString的功能
    安装mysql5.6
    centos6.9 PHP的编译安装并连接nginx
    centos6删除nginx
    centos6删除mysql安装
  • 原文地址:https://www.cnblogs.com/xbhog/p/11741079.html
Copyright © 2011-2022 走看看