// js 利用sort进行排序
sort可以按照元素的字符编码的顺序进行排序,条件是此元素必须为字符串。对于数字排序,定义规则是很重要的。(比较函数)
systemSort: function(array) {
return array.sort(function(a, b) {
return a - b;
});
},
// 冒泡排序
冒泡排序
定义一个变量作为中间值。在两个循环内(i> j),
比较 数组第i位和第j位,如果i小于j,i j利用中间值交换位置。
就是把一个数组中 大个的排在靠前或靠后的位置。
关键词 两个循环, 大个靠前
bubbleSort: function(array) {
var i = 0,
len = array.length,
j, d;
for (; i < len; i++) {
for (j = 0; j < len; j++) {
if (array[i] < array[j]) {
d = array[j];
array[j] = array[i];
array[i] = d;
}
}
}
return array;
},
// 快速排序
注意地方:
递归函数的使用 splice返回一个数组 要在函数中设置判断数组是否为1
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
// 插入排序
插入排序类似整理扑克牌,将每一张牌插到其他已经有序的牌中适当的位置。
插入排序由N-1趟排序组成,对于P=1到N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。
简单的说,就是插入排序总共需要排序N-1趟,从index为1开始,讲该位置上的元素与之前的元素比较,放入合适的位置,这样循环下来之后,即为有序数组
insertSort: function(array) {
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];
var i = 1,
j, step, key, len = array.length;
for (; i < len; i++) {
step = j = i;
key = array[j];
while (--j > -1) {
if (array[j] > key) {
array[j + 1] = array[j];
} else {
break;
}
}
array[j + 1] = key;
}
return array;
},
// 希尔排序
//Jun.array.shellSort(Jun.array.df(10000));
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序
shellSort: function(array) {
// http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组
//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择
var i = 0;
var stepArrLength = stepArr.length;
var len = array.length;
var len2 = parseInt(len / 2);
for (; i < stepArrLength; i++) {
if (stepArr[i] > len2) {
continue;
}
stepSort(stepArr[i]);
}
// 排序一个步长
function stepSort(step) {
//console.log(step) 使用的步长统计
var i = 0,
j = 0,
f, tem, key;
var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len / step;
for (; i < step; i++) { // 依次循环列
for (j = 1;
/*j < stepLen && */
step * j + i < len; j++) { //依次循环每列的每行
tem = f = step * j + i;
key = array[f];
while ((tem -= step) >= 0) { // 依次向上查找
if (array[tem] > key) {
array[tem + step] = array[tem];
} else {
break;
}
}
array[tem + step] = key;
}
}
}
return array;
}
作为一个前端工程师,对于图片和文字的热情是高于算法和逻辑的。但是,在数据大爆炸的今天,对于数据的处理和其处理的方法的效率,也十分重要。(不得不学)
这两天学完,其实是背着默写,但是,在不断调试bug的过程中,也逐渐被算法的魅力所吸引。所以发几个基础的算法和大家分享。