昨天搞了个通宵,总算把一堆与排序和图的算法用代码给实现了,其中最难的是堆排序和 Dijkstra 最短路径算法。今天早上扬眉吐气,以前望而生畏的东西,现在终于可以信手拈来了。
数组排序,以前我用快速排序,不过性能不太稳定,而且一不小心堆栈溢出。堆排序虽然比快速排序平均性能差点,但极端情况下要好得多,性能稳定。
经过测试,我的堆排序算法指令耗费为 75.66 N*log2 N,比快速排序平均性能 42.36 N*Log2N 要稍慢些,不过比冒泡法 10.32*N^2 要快许多了。也就是说,只要超过 17 个元素,则快速排序已经好于起泡排序;只要超过 39 个元素,则堆排序要好于起泡排序。
至于 Dijkstra 算法,以前上课也讲过,不过好象当时很难听懂。其实没什么难的,估计是那个老师不善于语言表达的缘故。实现起来其实也就一会的工夫。
先晾一下代码:
堆排序:
- public class HeapSortHeap {
- public int count;
- public int[] e;
- public HeapSortHeap(int count){
- this.count = count;
- e = new int[count+1];
- }
- public void HeapMake(int count){ //自上向下生成一个堆
- for (int i = count / 2; i > 0; i--) HeapAdjust(i, count);
- }
- //堆排序
- private void HeapAdjust(int idx, int count){ //自上向下调整一个堆
- for (int s = idx; s <= count / 2; ){
- int type = 0; int k = 0;
- if (e[s] < e[2 * s]) type |= 1;
- if (s < count / 2){