学习资料:https://github.com/liuyubobobo/Play-with-Algorithms
上面是C++和Java版本的代码
我跟着视频的思想写了一些JavaScript版本的
我的代码GitHub:
https://github.com/luxiaohai1024/studyCode/tree/master/algorithm-算法
(不断更新)
(function (window) {
let MyUtilMethod = {
//生成有n个元素的随机数组,每个元素的随机范围为[rangeL,rangeR]
"generateRandomArray": function (n, rangeL, rangeR) {
let arr = [];
for (let i = 0; i < n; i++) {
arr[i] = Math.round(Math.random() * (rangeR - rangeL) + rangeL);
}
return arr;
},
//打印数组的函数
"printArray": function (idName,arr) {
let arrStr = '';
let len = arr.length
for (let i = 0; i < len; i++) {
arrStr += (`${arr[i]} `);
}
$('#' + idName).append(arrStr);
},
//判断数组是否是已经排序的
"isSorted" : function (arr) {
let n = arr.length;
for(let i=0; i < n-1; i++){
if(arr[i] > arr[i+1]){
return false;
}
}
return true;
},
//测试代码性能的函数
"testSort" : function(methodName, methodFun, arr, showDivId){
let start = new Date().getTime();
methodFun(arr);
let end = new Date().getTime();
if(this.isSorted(arr)){
$('#' + showDivId).append(`${methodName} -->${end - start}`);
} else {
$('#' + showDivId).append(`fail to Sort`);
}
},
//拷贝数组
"copeArray" : function (arr) {
return arr.slice();
}
};
window.MyUtilMethod = MyUtilMethod;
})(window);
作用:
代码实现
(function (window) {
function SelectionSort (arr) {
let newArr = arr.concat();
let n = arr.length;
let middleValue = null;
for (let i=0; i
打牌的时候插入牌类似这种算法。
以8、6、2、3、1、5、7、4为例
优点:可以提前结束循环,当当前的数没有并前一个数小的时候,直接跳出循环。
代码实现
(function (window) {
function insertionSort(arr) {
let newArr = arr.concat();
let n = arr.length;
let middleValue = null;
for (let i = 1; i < n; i++) {
//寻找元素arr[i]合适的插入位置
for (let j = i; j > 0 && newArr[j] < newArr[j - 1]; j--) {
middleValue = newArr[j];
newArr[j] = newArr[j - 1];
newArr[j - 1] = middleValue;
}
}
return newArr;
}
window.insertionSort = insertionSort;
})(window)
以8、6、2、3、1、5、7、4为例
代码实现
(function (window) {
function insertionSort(arr) {
let newArr = arr.concat();
let n = arr.length;
for (let i = 1; i < n; i++) {
//寻找元素arr[i]合适的插入位置
let copeValue = newArr[i];
let j; //j保存元素copeValue应该插入的位置
for (j = i; j > 0 && newArr[j - 1] > copeValue; j--) {
newArr[j] = newArr[j-1];
}
newArr[j] = copeValue;
}
return newArr;
}
window.insertionSort = insertionSort;
})(window)
冒泡排序算法的原理如下:
代码实现
(function (window) {
function bubbleSort(arr) {
let newArr = arr.concat();
let i = arr.length,
j;
let tempExchangVal;
while (i > 0) {
for (j = 0; j < i - 1; j++) {
if (newArr[j] > newArr[j + 1]) {
tempExchangVal = newArr[j];
newArr[j] = newArr[j + 1];
newArr[j + 1] = tempExchangVal;
}
}
i--;
}
return newArr;
}
window.bubbleSort = bubbleSort;
})(window)
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。
算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i += step_size而不是i++)。
实例:
以[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],步长为5开始进行排序。
将上述四行数字,依序接在一起时我们得到:
[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].
这时10已经移至正确位置了,然后再以3为步长进行排序:
代码实现
(function (window) {
function ShellSort(arr) {
let newArr = arr.concat();
let n = arr.length;
let gap, i, j;
let temp;
for (gap = n >> 1; gap > 0; gap >>= 1) {
//有符号右移 a >> b;将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
for (i = gap; i < n; i++) {
temp = newArr[i];
for (j = i - gap; j >= 0 && newArr[j] > temp; j -= gap)
newArr[j + gap] = newArr[j];
newArr[j + gap] = temp;
}
}
return newArr;
}
window.ShellSort = ShellSort;
})(window);