排序算法七:基数排序(Radix sort)
摘要:上一篇提到了计数排序,它在输入序列元素的取值范围较小时,表现不俗。但是,现实生活中不总是满足这个条件,比如最大整形数据可以达到231-1,这样就存在2个问题:1)因为m的值很大,不再满足m=O(n),计数排序的时间复杂也就不再是线性的;2)当m很大时,为计数数组申请的内存空间会很大;为解决这两个问题...
阅读全文
排序算法六:计数排序(Counting sort)
摘要:前面介绍的几种排序算法,都是基于不同位置的元素比较,算法平均时间复杂度理论最好值是θ(nlgn).今天介绍一种新的排序算法,计数排序(Counting sort),计数排序是一个非基于比较的线性时间排序算法。它对输入的数据有附加的限制条件:输入序列中数据取值范围有限,比如都是小于upperLimit...
阅读全文
排序算法五:随机化快速排序(Randomized quicksort)
摘要:上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序、归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的。实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2)。为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Random...
阅读全文
排序算法四:快速排序(Quicksort)
摘要:快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快。快速排序也用到了分治思想。(一)算法实现 1 protected void quicksort(int[] array, int first, int...
阅读全文
排序算法三:堆排序(Heapsort)
摘要:堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步。(一)算法实现 1 protected void sort(int[] toSort) { 2 buildHeap(toSort); 3 for ...
阅读全文
排序算法二:归并排序(Merge sort)
摘要:归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn).(一)算法实现 1 private void merge_sort(int[] array, int first, int last) { 2 if (first + 1 arra...
阅读全文
排序算法一:插入排序(Insertion sort)
摘要:最近从网易公开课在看麻省理工学院的公开课《算法导论》,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看。文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解。本篇先说插入排序(insertion sort)。(一)算法实现 1 protect...
阅读全文