插入排序与冒泡排序的区别

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

(一)冒泡排序

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

代码实例:

      

 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次

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

原文地址:https://www.cnblogs.com/yeguo/p/3078202.html