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

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

(一)冒泡排序

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

代码实例:

      

 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/archive/2013/05/14/3078202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值