zoukankan      html  css  js  c++  java
  • 插入排序与冒泡排序的区别

    对于选择排序和冒泡排序的基本概念 

    (一)冒泡排序

        基本思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。主要通过两层循环来实现。

    代码实例:

          

     1   public int[] BubblingSort(int[] arr)
     2         {
     3             for (int i = 0; i < arr.Length; i++)
     4             {
     5                 for (int j = 1; j < arr.Length-i; j++)
     6                 {
     7                     if (arr[j] >arr[j - 1])
     8                     {
     9                         int temp = arr[j];
    10                         arr[j] = arr[j - 1];
    11                         arr[j - 1] = temp;
    12                     }
    13                 }
    14             }
    15             return arr;
    16         }
    View Code

    (二)插入排序

       基本思想:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,是稳定的排序方法。

    代码实例:

     1         public int[] InsertSort(int[] arr)
     2         {
     3             for (int i = 1; i < arr.Length; i++)
     4             {
     5                 int k = arr[i];
     6                 int j = i;
     7                 while (j > 0 && arr[j - 1] > k)
     8                 {
     9                     arr[j] = arr[j - 1];
    10                     j--;
    11                 }
    12                 arr[j] = k;
    13             }
    14             return arr;
    15         }
    View Code

    这里重点说下两种排序方法的区别

    假设有这样一个数组为 int []list=new list[]{1,2,3,4}; 我们要对其进行升序排序(很显然 这里已经是符合要求的升序排列).

    现在 假若我们用冒泡排序 大概流程会是这样:

    1.先将1,2进行比较 无须替换 然后2,3比较 无须替换 然后3,4比较 无须替换 完成第一轮冒泡 比较次数为3次

    2.将2,3进行比较 无须替换 然后3,4进行比较 无须替换  完成第二轮冒泡 比较次数为2次

    3.将3,4进行比较 无须替换 完成第三轮冒泡 比较次数为1次

    很显然 我们没有移动一次数字 但是却比较了6次

    再来看看插入排序如何实现 其详细步骤为:

    1.先设定1为有序区间 将2和1比较 无须移动 比较一次

    2.此时1,2均为有序区间 将3和2进行比较 无须移动 直接跳出while循环 比较一次

    3.此时1,2,3均为有序区间 将4和3进行比较 无须移动 直接跳出while循环 比较一次

    很显然 我们也没有移动数字 但是只比较了3次

    总的来说 冒泡排序 循环一次 就确定了第0位为最小值(针对升序)  而插入排序 循环一次 则将有序区间增加一位

    因此 针对部分有序的集合来说(这里说的有序 是指与我们想得到的顺序一致)  插入排序效率优于冒泡排序

    但是我们可以针对冒泡排序进行优化   当我们循环某一次 发现没有任何数字移动的时候 我们就已经知道 集合已经排序完成 而无须再进行循环

    示例代码:

     1   public int[] BubblingSort(int[] arr)
     2         {
     3             //集合中数字是否移动过
     4             bool flag = true;
     5             for (int i = 0; i < arr.Length; i++)
     6             {
     7                 if (flag)
     8                 {
     9                     for (int j = 1; j < arr.Length - i; j++)
    10                     {
    11                         flag = false;
    12                         if (arr[j] > arr[j - 1])
    13                         {
    14                             flag = true;
    15                             int temp = arr[j];
    16                             arr[j] = arr[j - 1];
    17                             arr[j - 1] = temp;
    18                         }
    19                     }
    20                 }
    21                 else
    22                 {
    23                     break;
    24                 }
    25             }
    26             return arr;
    27         }
    View Code

    此时的冒泡排序 循环次数和插入排序一样 均为3次

     如果这篇文章能够给与您帮助 不妨点个推荐吧!

  • 相关阅读:
    金融大数据行业应用及发展全洞察
    金融大数据行业应用及发展全洞察
    R语言-组间差异的非参数检验
    R语言-组间差异的非参数检验
    互联网,将从内部颠覆企业管理模式
    GitHub使用教程
    sublime text3编辑器经常使用快捷方式
    webpy学习笔记之中的一个
    浏览器的重绘和重排的影响
    《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记
  • 原文地址:https://www.cnblogs.com/yeguo/p/3078202.html
Copyright © 2011-2022 走看看