2011年9月22日
摘要: 可以说堆排序兼具了插入排序和归并排序的优点。想插入排序一样,它sorts in place;同时时间复杂度达到归并排序的级别O(nlgn)。以大根堆为例,大根堆中,除了根以外的每个结点i,都有: A[parent(i)]>=A[i]。大根堆的基本过程包括:max_heapify(a,i).对结点i及其子孙结点保持大根堆的性质;build_max_heap.对给定的数组建堆。思路是从最后一个非叶子结点开始max_heapify;heapsort.进行大根堆排序.从最后一个元素开始,交换根结点和其位置,然后max_heapify后重复此过程。//realization of heatsort 阅读全文
posted @ 2011-09-22 21:07 bovine 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 关于补码,微机原理这门课里面详细地叙述过,今天来是因为这个自己有些遗忘的细节。对于n位二进制表示的码字,补码的公式定义是:2^n+这个数 然后用二进制表示。比如:考虑n=8,对于正数15,补码应该是:2^8+15=00001111对于负数-15,补码应该是:2^8-15=11110001对于负数-128,补码应该是:2^8+(-2^7)=10000000 这个情况根据原码反码补码的公式是无法推导出来的这个例子告诉我,有时候口诀固然方便,但是回归本源往往是更加有效的方法。 阅读全文
posted @ 2011-09-22 19:54 bovine 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 算法导论上2-4是这样一个题目:设A[1...n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i, j)就称为A中的一个逆序对(inversion)。试给出一个算法,它能用O(nlgn)的最坏情况运行时间确定n个元素的任何排列中逆序对的数目。咋一看没有什么思路,可一看见提示赫然给出:修改归并排序,于是顿悟。其实,只需要在归并排序中加上一个计数器,在每次merge的时候计算逆序对,这样就可以算出总共的逆序对了。#include <iostream>using namespace std;void merge_sort(int *A,int 阅读全文
posted @ 2011-09-22 13:28 bovine 阅读(1789) 评论(0) 推荐(0) 编辑