基础排序算法优化
来源:互联网 发布:java int 除法取整 编辑:程序博客网 时间:2024/05/17 01:17
这篇博客,主要是最近学习算法导论时的一些收获,是关于直接选择排序,直接插入排序,二分查找的一些优化。
直接选择排序
数据结构课本上的直接选择排序就是每次选出一个最小的拿到最前面来:
function StraightSelectSort (arr) { var i = 0, len = arr.length - 1, cur, k, j; for (; i < len; i++) { cur = arr[i]; k = i; for (j = i + 1; j < len + 1; j++) { if (cur > arr[j]) { cur = arr[j]; k = j; } } if (k !== i) { arr[k] = arr[i]; arr[i] = cur; } }}
但是我们考虑一下,有没有可以优化的地方呢?既然我们每次都可以将最小的拿出来,那么是不是每次我们也可以将最大的拿出来呢?也就是说,我们需要在找最小的过程种同时进行找出最大的,并将最大的放到最后,这样我们时间复杂度就可以减少一半,下面来看代码:
function StraightSelectSort (arr) { var left = 0, right = arr.length - 1, curR, curL, l, r; while (left < right) { l = left; r = left; curL = arr[left]; curR = arr[left]; for (var i = left + 1; i <= right; i++) { if (arr[i] < curL) { curL = arr[i]; l = i; } else if (arr[i] > curR) { curR = arr[i]; r = i; } } if (l !== left) { arr[l] = arr[left]; arr[left] = curL; } if (r !== left) { arr[r] = arr[right]; arr[right] = curR; } // 数组进行收敛 left++; right--; } return arr;}
直接插入排序
直接插入排序,是将一个数字插入到一个已经排好序的序列中,课本上的做法是,将这个数字与已经排好序的序列中的每一个数字进行比较,直到找出合适的位置:
function InsertionSort (arr) { var key, i = 1, len = arr.length; for (; i < len; i++) { key = arr[i]; j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } return arr;}
这里也有值得优化的地方,那就是找位置,我们假如采取二分查找的方法将位置找出来,这样就可以减少我们的比较的次数,从而对我们的算法进行一些优化:
function InsertionSort (arr) { var key, i = 1, len = arr.length; for (; i < len; i++) { key = arr[i]; var index = BinaryFindPos(arr, i, key); for (var j = i - 1; j >= index; j--) { arr[j + 1] = arr[j]; } arr[index] = key; } return arr;}function BinaryFindPos (arr, s, value) { var left = 0, right = s - 1, mid; while (left <= right) { mid = (left + right) >> 1; if (value >= arr[mid]) left = mid + 1; else right = mid - 1; } return left;}
0 0
- 基础排序算法优化
- 【基础算法】排序-复杂排序之一(归并排序的两种优化讨论)
- 优化冒泡排序算法
- 插入排序算法优化
- 选择排序优化算法
- C++——算法基础之排序——冒泡排序(优化)
- 最优化算法基础
- 排序算法 优化冒泡排序算法
- 基础排序算法-归并排序
- 基础排序算法-快速排序
- Lucene基础排序算法
- 基础排序算法演示
- 基础排序算法
- 基础排序算法
- 基础排序算法
- 基础排序算法总结
- 基础算法-插入排序
- 基础算法 排序
- html5中对prototype的理解
- 前端开发工具——sublime及其插件的安装
- Android-短信验证功能实现
- JAVASE总结--05(continue、break)
- 考试中的问题(对数组的操作)
- 基础排序算法优化
- log4j配置打印mybatis sql语句
- Github,乱码问题
- click绑定事件介绍
- 重学 statistics, Cha10 Inference About Means and Proportions with Two Populations
- BBC之时间之旅--加来道雄
- 实现自己的C++ STL--vector容器
- 编写Java程序,打印下图所示的字母组成的菱形(且每次运行时该菱形大小可能不一)。
- Java虚拟机知识整理——虚拟机类加载的时机