快速排序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) {
int i = l -, j = r;
Item v = a[r];
for ( ; ; ) {
while (a[++i] < v);
while (a[--j] > v)
if (j == i) break;
if (i >= j) break;
exch (a[i], a[j]);
}
exch (a[i], a[r]);
return i;
}

快速排序的思想可以用来找出数组中第k大的数

template <class Item>
Item select (Item a[], int l, int r, int k) {
if (r <= l)
return a[l];
int i = partition(a, l, r);
if (i > k)
select(a, l, i-, k);
if (i < k)
select(a, i+, r, k);
}

归并排序MergeSort

数组实现

template <class Item>
void merge(Item a[], int l, int m, int r) {
int i, j;
static Item aux[maxN];
for (i = m; i>=l; i--)
aux[i] = a[i];
for (j = m; j<r; j++)
aux[r+m-j] = a[j+];
for (int k = l; k<=r; k++) {
if (aux[j] < aux[i])
a[k] = aux[j--];
else
a[k] = aux[i++];
}
} template <class Item>
void mergeSort (Item a[], int l, int r) {
if (r <= l)
return;
int m = (r+l) / ;
mergeSort(a, l, m);
mergeSort(a, m+, r);
merge(a, l, m, r);
}

链表实现

link merge (link a, link b) {
node dummy();
link head = &dummy, c = head;
while ((a!=) && (b!=)) {
if (a->item < b->item) {
c->next = a;
c = a;
a = a->next;
}
else {
c->next = b;
c = b;
b = b->next;
}
}
c->next = (a==) ? b : a;
return head->next;
} link mergeSort (link c) {
if (c== || c->next==)
return c;
link a = c, b = c->next;
while ((b!=) && (b->next!=)) {
c = c->next;
b = b->next->next;
}
return merge (mergeSort(a), mergeSort(b));
}

堆排序HeapSort

template <class Item>
void fixDown (Item a[], int k, int n) {
while (*k+ < n) {
int child = *k + ;
if ((child+<n) && (a[child]<a[child+])
child++;
if (a[k] < a[child]) {
exch(a[k], a[child]);
k = child;
}
else
return;
} template <class Item>
void heapSort (Item a[], int n) {
int k;
// 建堆
for (k = n/; k >= ; k--)
fixDown(a, k, n); //排序
while (n->) {
exch (a[], a[n-]);
fixDown(a, k, --n);
}
}

排序算法——QuickSort、MergeSort、HeapSort(C++实现)的更多相关文章

  1. 排序算法FOUR:堆排序HeapSort

    /** *堆排序思路:O(nlogn) * 用最大堆,传入一个数组,先用数组建堆,维护堆的性质 * 再把第一个数与堆最后一个数调换,因为第一个数是最大的 * 把堆的大小减小一 * 再 在堆的大小上维护 ...

  2. 排序算法之快速排序(Quicksort)解析

    一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个 ...

  3. 【从零学习经典算法系列】分治策略实例——高速排序(QuickSort)

    在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序.并给出了递归形式和循环 ...

  4. 排序算法之堆排序(Heapsort)解析

    一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...

  5. Python排序算法(六)——归并排序(MERGE-SORT)

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10800699.html 一.归并排序(MERG ...

  6. 排序算法五:随机化快速排序(Randomized quicksort)

    上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快 ...

  7. 排序算法四:快速排序(Quicksort)

    快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...

  8. 排序算法三:堆排序(Heapsort)

    堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步. (一)算法实现 protected void sort(int[] toSort) ...

  9. 斯坦福算法分析和设计_2. 排序算法MergeSort

      Motivate MergeSort是个相对古老的算法了,为什么现在我们还要讨论这么古老的东西呢?有几个原因: 它虽然年龄很大了,但是在实践中一直被沿用,仍然是很多程序库中的标准算法之一. 实现它 ...

随机推荐

  1. linux下mysql的表名问题

    最近从win转移到了linux,在本机跑好的程序但在linux下一个SQL语句报了错误,发现是表名未找到,错误原因是在linux下mysql的表名是严格区分大小写的.. MYSQL在LINUX下数据库 ...

  2. [读书笔记]了不起的node.js+实践(一)

    环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...

  3. leptonica使用问题

    想要使用leptonica编写一个图像处理程序,或者调用leptonica/prog下例子程序,出现类似错误: leptTest ./test Error in pixReadStreamJpeg: ...

  4. A Tour of Go Variables

    The var statement declares a list of variables; as in function argument lists, the type is last. pac ...

  5. Robotium学习笔记二

    一. 控制测试用例的执行顺序 采用TestSuit方式来控制每条Case的运行顺序 Demo如下 public static Test suite() { TestSuite suite = new ...

  6. [Unity] How to stop camera rendering?

    http://answers.unity3d.com/questions/147988/how-to-pause-the-main-camera-.html I would simply pause ...

  7. 密钥,密钥对,公钥,pfx,jks和https的几个概念

    密钥: 我理解是公钥+私钥的统称. 密钥对: 公钥(证书)和私钥成对存在. 通信双方各持有自己的私钥和对方的公钥.自己的私钥需密切保护,而公钥是公开给对方的.在windows下,单独存在的公钥一般是后 ...

  8. java list&lt;string&gt;组 传递到值js排列

    方法一 后台:     String sql = "select * from tree";     list = this.treeService.getTreeList(sql ...

  9. JSTL-core核心代码标签库中的forEach,remove, forTokens,choose,when,otherwise,redirect 标签

    <%@ page language="java" import="java.util.*, cn.hncu.domain.*" pageEncoding= ...

  10. 自定的TableView

    一.自定的TableView 有的时候,我们需要vc视图中添加一个表视图,此时在ViewController中使用TableViewController是不可行的这就,因此就要使用自定义的TableV ...