冒泡有三种方式你知道吗?

前言

说实话今天给我触动的蛮大的,今天无意中看到一位同事在跟另一位同事交流,看到他们打开一个网站,然后嘀嘀咕咕的。出于好奇然后凑上去了解到原来是一位同事自己的开发了一个网站,网站的功能跟淘宝的一样,可以商家入驻,然后还可以与微信公众群进行相关联的一系列互动,了解到也是自己一个人做的。然后瞬间感觉自己好矮小,除了完成工作的上的一些任务,自己真没什么拿的出手的,所以我想完善自己的博客,将博客作为我的作品。好了,下面进入正题,今天分享的就是冒泡算法的三种方式。

最简单的排序实现

 1    public static IList<T> BubbleSort<T>(IList<T> arr) where T : IComparable<T>
 2         {
 3             int length = arr.Count();
 4             for (int i = 0; i < length; i++)
 5             {
 6                 for (int j = i + 1; j < length; j++)
 7                 {
 8                     if (arr[i].CompareTo(arr[j]) > 0)
 9                     {
10                         var temp = arr[i];
11                         arr[i] = arr[j];
12                         arr[j] = temp;
13                     }
14                 }
15             }
16             return arr;
17         }

这上面严格意义上说,并不算冒泡算法。因为不能满足“两两比较的思想”,只能算是最最简单的交换排序。

真正意义的冒泡排序

 1    public static IList<T> BubbleSort<T>(IList<T> arr) where T : IComparable<T>
 2         {
 3             int lenght = arr.Count();
 4             for (int i = 0; i < lenght; i++)
 5             {
 6                 for (int j = lenght - 1; j > i; j--)
 7                 {
 8                     if (arr[j - 1].CompareTo(arr[j]) > 0)
 9                     {
10                         var temp = arr[j - 1];
11                         arr[j - 1] = arr[j];
12                         arr[j] = temp;
13                     }
14                 }
15             }
16             return arr;
17         }

上面的冒泡可以看出,当数组已经排序好了,但是依然循环排序,所以可以对此可以做出优化新增标志位flag来判断

优化的冒泡

 1   public static IList<T> BubbleSort<T>(IList<T> arr) where T : IComparable<T>
 2         {
 3             int lenght = arr.Count();
 4             bool flag = false;
 5             for (int i = 0; i < lenght; i++)
 6             {
 7                 flag = true;
 8                 for (int j = lenght - 1; j > i; j--)
 9                 {
10                     if (arr[j - 1].CompareTo(arr[j]) > 0)
11                     {
12                         var temp = arr[j - 1];
13                         arr[j - 1] = arr[j];
14                         arr[j] = temp;
15                         flag = false;
16                     }
17                 }
18                 if (flag)
19                     break;
20             }
21             return arr;
22         }

总结:自己对于算法这块还很欠缺,所以这段时间会看算法方面的书籍,以提升自己在写程序方面的效率。看完之后的我也会更新到博客上面,希望大家不吝赐教,感谢!

时间: 2024-11-01 21:09:39

冒泡有三种方式你知道吗?的相关文章

Mac OS X中,有三种方式来实现启动项的配置

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 22.0px "Times New Roman"; color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Times New Roman"; color: #000000 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0p

启动/关闭oracle服务有三种方式

启动oracle服务有三种方式:?1 从控制面板?2 使用MS-DOS命令?3 通过Oracle Administration Assistant for WindowsNT -通过控制面板启动oracle服务?1)选择开始 > 控制面板 〉管理工具 --〉服务?2)找到你所要启动的oracle服务,单击启动 -通过MS-DOS命令启动oracle服务?1)打开DOS窗口?2)在窗口中输入:NET START OracleServiceName -通过Oracle Administration

delphi使用消息传递字符串有三种方式可以实现

1.直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递 传递消息: [delphi] view plaincopy var Str: String; begin Str := 'some string'; PostMessage(Handle, 0, 0, Integer(Str)); end; 接收消息: [delphi] view plaincopy var Str: String; begin Str := String(Msg.LParam); ShowMessage(Str)

JS 阻止冒泡的方式

//阻止冒泡事件 function stopBubble(e) { if (e && e.stopPropagation) {//非IE e.stopPropagation();    } else {//IE window.event.cancelBubble = true; } }

微信公众号的文章爬取有三种方式

a. 通过微信订阅号在发布文章,可以查找公众号的文章,方式见微信链接.,阅读数.点赞数.评论数仍无法抓取. b. 通过搜狗微信搜索微信公众号,但是文章篇幅仍然后有限制,点赞.阅读数.和评论数无法抓取. c. 通过“中间人方式”对数据进行拦截,过滤解析后进行抓取. 这里就时利用第三种c方式对数据进行抓取. 思路: 1. 安装代理AnProxy,在手机端安装CA证书,启动代理,设置手机代理: 2. 获取目标微信公众号的__biz; 3. 进入微信公众号的历史页面: 4. 使用Monkeyrunner

如何让html的某个元素隐藏,我们一般有三种方式:display:none, opacity:0, visibility:hidden。但这三种方式有何区别?

1. display:none 该方式让元素隐藏时,隐藏的元素不占空间,隐藏后将改变html原有样式.一旦父节点元素应用了display:none,父节点及其子孙节点元素全部不可见,而且无论其子孙元素如何不屈地挣扎都无济于事. 2. visibility:hidden 该方式让元素隐藏时,隐藏的元素还是占用原有位置,隐藏后不将改变html原有样式.但,如果该元素的子元素使用了visibility:visible的话,改子元素将不被隐藏. 3. opacity:0 该方式让元素隐藏时,隐藏的元素还

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

When compiling Qt you can choose one of these options based on the configure command line: no OpenSSL support (-no-openssl)QtNetwork dynamically opening OpenSSL libs (-openssl; default)QtNetwork linking to OpenSSL (-openssl-linked)The last one means

C#中对象的销毁有三种方式Finalize,Dispose,GC。

1.Finalize方法(C#中是析构函数,以下称析构函数)是用于释放非托管资源的,而托管资源会由GC自动回收.所以,我们也可以这样来区分托管和非托管资源.所有会由GC自动回收的资源,就是托管的资源,而不能由GC自动回收的资源,就是非托管资源.在我们的类中直接使用非托管资源的情况很少,所以基本上不用我们写析构函数. 2.大部分的非托管资源会给系统带来很多负面影响,例如数据库连接不被释放就可能导致连接池中的可用数据库连接用尽.文件不关闭会导致其它进程无法读写这个文件等等. 实现模型:1.由于大多数

在spring容器中定义初始化和销毁bean前所做的操作,有三种方式

1.使用注解,通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 package com.luoq.test.annotation.init; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class TestBean { private String message; public String getMessage()