摘要: 本blog总结了常见的排序算法,笔者在以下几篇随笔中,用简洁而概括的语言和图表描述了算法的内容、思想、运行时间等等,其中算法的伪代码描述都是摘自《算法导论》一书。希望能给大家带来一些收获。 常见的排序算法主要有:插入排序 insertion sort;归并排序 merge sort;冒泡排序 bubble sort;堆排序 heap sort;快速排序 quick sort;计数排序 counting sort;基数排序 radix sort;桶排序 bucket sort。 插入排序、归并排序、堆排序、快速排序都是比较排序。它们通过对数组中的元素比较来进行排序。定理:任意一个比较排序算法在最坏情况下,都需要做Ω(n lg n)次的比较。 阅读全文
posted @ 2013-05-22 16:22 windlaughing 阅读(1374) 评论(0) 推荐(1) 编辑
摘要: 与计数排序类似,桶排序也做了某种假设。计数排序假设输入是一个小范围内的整数。桶排序假设输入元素均匀而独立的分布在区间 [0,1)上。排序思想:把区间划分成n个大小相同的子区间,或称为桶。然后将n个输入元素分布的各个桶中去。先对各个桶中的数进行排序,然后按次序把各桶中的数据列出来即可。 阅读全文
posted @ 2013-05-22 15:20 windlaughing 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较,先按最低有效数字进行比较,再比较高位(高位的决定权更大,所以最后排序)。基数排序也可以应用于字符串(比如名字或日期)和特定格式的浮点数。 阅读全文
posted @ 2013-05-22 15:15 windlaughing 阅读(591) 评论(0) 推荐(0) 编辑
摘要: 如果n个待排序元素,每个元素的值都在0~k之间,k为某个整数,可以采用计数排序。其运行时间为Θ(n)。 计数排序的一个重要性质就是它是稳定的:具有相同值得元素在输出数组中的位置 与 它们在输入数组中的位置相同。 阅读全文
posted @ 2013-05-22 15:06 windlaughing 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 快速排序是基于分治策略,其期望的运行时间为Θ(n lg n),且Θ(n lg n)记号中隐藏的常数因子很小。所以快速排序通常是用于排序的最佳选择。快速排序分3个步骤: 1、分解:数组A[p..r]划分为两个子数组 A[p..q-1]和A[q+1.. r]。使得A[p..q-1]中元素都小于A[q],A[q+1.. r]中元素都大于A[q]。2、解决:递归调用快速排序,对数组 A[p..q-1]和A[q+1.. r]排序。3、合并:因为都是原地排序,所以不需要合并。整个数组A[p..r]已排序。 阅读全文
posted @ 2013-05-22 14:51 windlaughing 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 堆排序:运行时间为O(n lg n);原地排序算法:在任何时候,数组中只有常数个元素存储在输入数组之外。堆排序利用了某种数据结构来管理算法执行中的信息——堆数据结构。(二叉)堆数据结构是一种数据结构,可以视为一颗完全二叉树。二叉堆有两种:最大堆、最小堆。 阅读全文
posted @ 2013-05-22 14:39 windlaughing 阅读(361) 评论(0) 推荐(0) 编辑
摘要: 冒泡排序是经过n-1趟子排序完成的,每趟时间c(n-i)。时间复杂度为O(n^2) 阅读全文
posted @ 2013-05-22 14:26 windlaughing 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 归并排序应用了分治策略。算法分3步骤:分解Divide; 解决Conquer; 合并Combine。 运行时间为 O(n lg n)。因为对数函数的增长速度比任何线性函数增长的都要慢,所以归并排序比插入排序好。 阅读全文
posted @ 2013-05-22 14:13 windlaughing 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 插入排序算法分析:1、数组A分三部分: A[i .. j-1]已排好序,A[j]待插入,A[j+1 .. n]未排序;2、插入排序是一个数组内的排序,排序过程中有O(1)个元素在数组外。插入排序的最坏情况时间代价为 O(n2) 阅读全文
posted @ 2013-05-22 14:03 windlaughing 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 当我们实现一个文件下载功能时,大多数人是通过Strust等框架实现的。Strust框架把底层的文件下载细节隐藏了起来,使我们不得其要领。下面我通过一个程序示例来再现通过Servlet下载文件的细节和原理。示例.....。文件下载的原理非常简单,就是把数据从一个输入流中读出数据,再写入一个输出流。这里的输入流是FileInputStream(为了提高速度,对其包装了一个装饰类BufferedInputStream,以提供缓冲功能),输出流是ServletOutputStream。 阅读全文
posted @ 2013-04-22 18:11 windlaughing 阅读(9212) 评论(3) 推荐(2) 编辑