随笔分类 -  排序算法

摘要:最近一段时间学习了python,发现python真是个强大,强大到和Matlab相媲美。为了熟悉python,将之前的各种排序算法用python实现了一下。常用的时间复杂度为O(n^2)的排序算法有冒泡排序,插入排序和选择排序,时间复杂度为O(nlog2(n))的算法有快速排序,归并排序和堆排序,这里的快速排序的初始比较值partition是随机给定的,在用python进行编写时能更清楚的理解整个排序算法的过程。 1 import random 2 def BubbleSort(num): 3 n=len(num) 4 for i in range(0,n): 5 ... 阅读全文
posted @ 2013-03-15 11:03 lscheng 阅读(7167) 评论(1) 推荐(0)
摘要:今天有点时间,打算看点编程算法相关的东西,但是又不想单单看将数据结构和算法的课本,那些课本都太枯燥,提不起兴趣来学习。今天在网上看到《编程珠玑》这本书,下下来研究一下,讲的都是算法和问题如何求解的,通过一个例子来讲解算法,这很有意思,国外的大牛讲的也很通俗易懂,计划有时间要多看看这本书。 今天看了第一章的例子,问题的需求如下:输入:输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,n很大,如果输入时有一个整数出现了两次,就会产生一个致命的错误。输出:以赠序形式输出排序之后的整数列表。 要解决这个问题,首先要生成自己的测试数据,一开始看的时候自己生成测试数据这块还真的把我给蒙住了... 阅读全文
posted @ 2012-10-26 20:43 lscheng 阅读(460) 评论(0) 推荐(0)
摘要:快速排序(Quicksort)是对冒泡排序的一种改进。基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快速排序的算法是: 1)设置两个变.. 阅读全文
posted @ 2012-09-13 22:32 lscheng 阅读(214) 评论(0) 推荐(0)
摘要:希尔(Shell)排序是插入排序的扩展,它允许非相邻的数据项进行交换来提高执行效率。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。例如:初始:d=5 49 38 65 97 76 13 27 49 55 04 49 13 |-------------------| 38 27 |- 阅读全文
posted @ 2012-09-12 20:15 lscheng 阅读(231) 评论(0) 推荐(0)
摘要:冒泡排序是我学习的最早的排序算法。它很简单:遍历文件,如果临近的两个元素的顺序不对,那么就将两者交换,重复这样的操作直到整个文件排好序。一种实现算法:#include <iostream>#include <stdlib.h>using namespace std;template <typename Item>void compexch(Item &A,Item &B){ if (B<A) exch(A,B);}template <typename Item>void bubble(Item a[], int l, int 阅读全文
posted @ 2012-09-12 20:03 lscheng 阅读(186) 评论(0) 推荐(0)
摘要:插入排序 算法思路:和桥牌中类似,每次只考虑一张牌,将新来的牌插入已经排好序的牌中的适当的位置中。在计算机应用中,为了插入新数据,先将较大的数据项一个个向右移动,然后将新数据插入空位中。和选择排序算法一样,排序过程中当前数据项的左边是排好的,不过它们不是处于最后的位置上,因为之后它们可能还需要进行移动来为更小的数据腾出空间。当索引移到最右边时,数组就完全排序好了。一个高效的插入排序的实现:#include <iostream>#include <stdlib.h>using namespace std;template <typename Item>void 阅读全文
posted @ 2012-09-11 22:20 lscheng 阅读(207) 评论(0) 推荐(0)
摘要:从今天开始好好研究下排序算法,每一种排序算法都实现并分析。排序的基本知识:文件的排序,这些文件包括数据项(item)和键(key),键是数据项的一个小部分,用于控制排序。排序算法的目的是重新组合数据项,使其键根据一些已经定义好的排序规则整齐排列。如果被排序的文件适合放在内存中,则排序算法被称为内部排序,从磁盘中对文件进行排序,称之为外部排序。首先介绍的是一种最简单的排序算法。选择排序 算法步骤:首先选出数组中最小的项,将它和数组的第一个成员交换(假如按照升序排列),然后选出次小的项,将其与第二个成员交换。按照这种思路一直做下去,直到整个数组排列完成。实现源代码:#include <ios 阅读全文
posted @ 2012-09-11 19:02 lscheng 阅读(868) 评论(2) 推荐(0)