快速排序QuickSort template <class Item> void quickSort (Item a[], int l, int r) { if (r<=l) return; int i = partition(a, l, r); quickSort(a, l, i-); quickSort(a, i+, r); } template <class Item> int partition (Item a[], int l, int r) { , j = r;…
/** *堆排序思路:O(nlogn) * 用最大堆,传入一个数组,先用数组建堆,维护堆的性质 * 再把第一个数与堆最后一个数调换,因为第一个数是最大的 * 把堆的大小减小一 * 再 在堆的大小上维护堆的性质 * 重复操作.. * * */ public class HeapSort { /** *静态变量存放堆的大小 */ private static int heapsize = 0 ; /** *堆排序主方法 * 构建最大堆,然后进行堆排序 * 堆排序是把最上面的最大的元素放在最下面,然后…
一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个步骤: 1.如何“分”?(如何缩小问题的规模) 2.如何“治”?(如何解决子问题) 快排的前身是归并,而正是因为归并存在不可忽视的缺点,才产生了快排.归并的最大问题是需要额外的存储空间,并且由于合并过程不确定,致使每个元素在序列中的最终位置上不可预知的.针对这一点,快速排序提出了新的思路:把更多的时…
在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环形式的c代码实例.可是归并排序有两个特点.一是在归并(即分治策略中的合并步骤)上花费的功夫较多,二是排序过程中须要使用额外的存储空间(异地排序算法<out of place sort>). 为了节省存储空间.出现了高速排序算法(原地排序in-place sort). 高速排序是由东尼·霍尔所发展的…
一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复杂度为O(nlogn)) 除了高效之外,最大的亮点就是只需要O(1)的辅助空间了,既最高效率又最节省空间,只此一家了 堆排序效率相对稳定,不像快排在最坏情况下时间复杂度会变成O(n^2)),所以无论待排序序列是否有序,堆排序的效率都是O(nlogn)不变(注意这里的稳定特指平均时间复杂度=最坏时间复…
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10800699.html 一.归并排序(MERGE-SORT)概念 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并排序适用于子序列有序的数据排序. 1.原理 归并排序是分治法的典型应用.分治法(Divide-and-Conquer):将原…
上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2).为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Randomized quicksort). 快速排序在选主元(pivot)时,总是选择第一个:随机化快速排序的思想是,随机从序列中选择一个作为主元. (一)算法实现 protected void quickso…
快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 protected void quicksort(int[] array, int first, int last) { int pivot = array[first]; int i = first; int j = last - 1; boolean serachBig = true; while…
堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步. (一)算法实现 protected void sort(int[] toSort) { buildHeap(toSort); for (int i = toSort.length - 1; i > 0; i--) { CommonUtils.swap(toSort, 0, i); adjustHeap(toSort, 0, i); } } /** * * @param toSort…
  Motivate MergeSort是个相对古老的算法了,为什么现在我们还要讨论这么古老的东西呢?有几个原因: 它虽然年龄很大了,但是在实践中一直被沿用,仍然是很多程序库中的标准算法之一. 实现它的本质是分治思想,是一个理解分治算法思想的好例子,好起点. 本文会使用“递归树”来对它进行运行时间分析,后面会集合这种思路生成“主方法”. 题目   输入一个数组,数组里面的每个数字是不重复的,输出是已经排序好的数组. 比如输入的是: 期望输出的是: 可能之前我们有所知道一些排序算法,比如Selec…