排序算法实践

    最近实践了下排序算法,等下就要去开启疯狂的娱乐模式了,因此这里先记录下。

    不过貌似翻墙软件忘了关,导致第二天才能补上。。。 真是醉了,不过经过一晚上的调整,包括生理和心里,今天感觉要好多了,加之考了科一和将电脑投屏弄了,心情反而有一些好的趋势。。 

   不过该补的还得补:

     第一个练习的是选择排序,优点明显,简单:



虽然以前看过一点c ++的书,不过跟不看没什么区别,因为那时根本不知道学那些基本数据类型做一些简单的四则运算有什么用,也就更谈不上什么入门了。因为连入门的标准是什么都不清楚。   但是这里类比着java来理解,还是有一些错误。。   毕竟一个是需编译的。


当时检验的时候貌似是由于 <<符未重置,导致语法分析出错。   或许结构体要求必须重载该运算符吧,具体还没了解。 


   原来这个是重载的意思。


   以上便是选择排序的所有内容,怎么说呢?   觉得最关键的部分在于swap()函数,这应该是标准库中的一个方法。  它本生附带了一些逻辑功能。需要消耗性能。 

    接下类是一个差不多的排序,冒泡排序。   之所以说差不多,是因为一个是纵向一个是横向。除了理解起来有一点差异,貌似实现上还真差不多。


   但是实际检测的时候选择排序是要优于冒泡排序的,原因在于  冒泡排序它的移动速度是相邻两两移动的,而选择排序可以按照域进行移动,即已分域  和 未分域。。    并且感觉理解起来,选择排序还好理解一点,因为更符合普通人的思维。。 

   接下类是一个相对高级一点的排序算法,插入排序,但是它的门槛相对还适合普通人理解:



   插入排序demo种,给了好几个版本的实现,都是逐步优化。  不过不采用swap标准库的这个方法,性能的化可以提交接近一倍,主要原因在于降低了移动的次数。。   且恰好降低了一半。   

   这些个算法都有一个共同的特点,那就是理解起来,他们其实是有一个类似于游标,或者说指针,或者说地址的这样一种东西在进行着指导。 我也不知道没有指针的高级语言是一种辛运还是一种不幸。

    以上三个方法是普通人稍一理解下还是比较容易接受的。

        从实现上面来看,它们基本都可以通过两层循环实现,每层循环负责各自有自己的负责逻辑。。   并且通常外层的循环处理的逻辑还大都相同,就是负责任务的推进 以及  所过之处的维护。。  内层大多时候是维护调整(选择,插入)。   冒泡排序有些特殊,作为一个理解起来十分简单的效率不高的排序算法,这里实现的是采用了三层循环,尽管应该是有方法确定具体的遍历次数,但是由于达到一个解耦的要求,所以还是采用了开关型  循坏。。   自然位于最外层,它还是充当了一个任务推进的任务。第二层应该也是充当了一个任务推进的逻辑角色,最内层则是一个维护。

    接下来是一个普通人费一些劲才能想通的算法: 希尔排序  shell sort:





     希尔排序我想是一些专家经过反复实践,理论推导从而得出的一个算法。   这个算法已经不再是我们眉头皱一皱便能理解的算法了,我想至少得经过实践才能有一些理解的算法。   它在很多方面实现了一个相对智能的功能。。 如智能步长,定制化步进制。。

    希尔算法在实践中有以下的一些感悟: 

          它不再是通过内外层分配逻辑,而是整个任务是分散的,或者说至少有分散的雏形。。   换句话说,从一个逻辑上的函数调用变成了一个逻辑上的过程调用。

           希尔排序借鉴了插入排序的一些思想,尤其是它在步域之间调整的时候,也就是核心块的第二层和第三层。

           希尔排序的核心块的整体结构类似于冒泡排序。  即最外层开关,二三层共同负责任务的推进,维护等。。 

            最后也可以看到算法的力量,十万条随机数各种算法的差距之大,这种差距已经是人能够很显著的感觉到,当调到百万,千万,甚至亿级以上时,有些算法早就淘汰的连渣渣都不剩了。。   我当时有这样的疑问,就是这里时对整数型数据进行排序。  而实际计算机处理的是一种多媒体数据。。  但是了解了字符编码,流数据,进制数这些计算机科学的概念,或者说进行一些相关的练习,应该可以知道,流数据,字符,编码,最终都能以某种方式转化为序数。。 因此它的意义应该还是蛮大的。。 

        接下来demo上应该是还有两三个排序。。 我认为已经达到了普通人几乎难以接受的地步,就算沉心下来仔细研究也不太容易弄懂的地步了。。  其中就有一个归并排序。。   但是我在练习时遇到了个问题,就是数据量在5万量级以下正常,五万量级之后则直接退出,也不报错。。 不得不说这些问题解决起来真有一种崩溃的感觉,一定要在精气神足够的时候进行,切记切记。。   等后面几个练习完了之后再记录记录,相信对自己薄弱的基础还是或多或少有些帮助的。

猜你喜欢

转载自blog.csdn.net/qq_36285943/article/details/80918500