这篇文章主要介绍了 JS 数组排序技巧, 实例汇总了 JavaScript 冒泡排序、sort 排序、快速排序、希尔排序等, 并附带分析了 sort 排序的相关注意事项, 需要的朋友可以参考下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
本文实例总结了 JS 数组排序技巧。分享给大家供大家参考,具体如下:
① 冒泡排序
- 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;
- }
② js 利用 sort 进行排序
- systemSort:function(array)
- { return array.sort(function(a, b)
- { return a - b; });
- }
③ 快速排序
- quickSort: function(array) { //var array = [8,4,6,2,7,9,3,5,74,5]; //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 = 0;
- var j = array.length - 1;
- var Sort = function(i, j) {
- // 结束条件
- if (i == j) {
- return
- };
- var key = array[i];
- var tempi = i;
- // 记录开始位置 var tempj = j; // 记录结束位置
- while (j > i) {
- // j <<-------------- 向前查找
- if (array[j] >= key) {
- j--;
- } else {
- array[i] = array[j] //i++ ------------>>向后查找
- while (j > ++i) {
- if (array[i] > key) {
- array[j] = array[i];
- break;
- }
- }
- }
- } // 如果第一个取出的 key 是最小的数
- if (tempi == i) {
- Sort(++i, tempj);
- return;
- }
- // 最后一个空位留给
- key array[i] = key;
- // 递归 Sort(tempi, i);
- Sort(j, tempj);
- }
- Sort(i, j);
- return array;
- }
④希尔排序
- //Jun.array.shellSort(Jun.array.df(10000));
- shellSort: function(array) {
- // var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];
- var tempArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];
- // reverse() 在维基上看到这个最优的步长 较小数组
- //var tempArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]
- //针对大数组的步长选择
- var i = 0;
- var tempArrtempArrLength = tempArr.length;
- var len = array.length;
- var len2 = parseInt(len / 2);
- for (; i < tempArrLength; i++) {
- if (tempArr[i] > len2) {
- continue;
- }
- tempSort(tempArr[i]);
- }
- // 排序一个步长
- function tempSort(temp) {
- //console.log(temp) 使用的步长统计
- var i = 0,
- j = 0,
- f, tem, key;
- var tempLen = len % temp > 0 ? parseInt(len / temp) + 1 : len / temp;
- for (; i < temp; i++) {
- // 依次循环列
- for (j = 1;
- /*j < tempLen && */
- temp * j + i < len; j++) {
- //依次循环每列的每行
- tem = f = temp * j + i;
- key = array[f];
- while ((tem -= temp) >= 0) {
- // 依次向上查找
- if (array[tem] > key) {
- array[tem + temp] = array[tem];
- } else {
- break;
- }
- }
- array[tem + temp] = key;
- }
- }
- }
- return array;
- }
⑤ 插入排序
- 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, temp, key, len = array.length;
- for(; i < len; i++){
- temp = 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;
- }
附:js 中数组 (Array) 的排序 (sort) 注意事项
- var arrDemo = new Array();
- arrDemo[0] = 10;
- arrDemo[1] = 50;
- arrDemo[2] = 51;
- arrDemo[3] = 100;
- arrDemo.sort(); //调用sort方法后,数组本身会被改变,即影响原数组
- alert(arrDemo); //10,100,50,51 默认情况下sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序
- arrDemo.sort(function(a, b) {
- return a > b ? 1 : -1
- }); //从小到大排序
- alert(arrDemo); //10,50,51,100
- arrDemo.sort(function(a, b) {
- return a < b ? 1 : -1
- }); //从大到小排序
- alert(arrDemo); //100,51,50,10
结论:
1. 数组调用 sort 方法后,会影响本身 (而非生成新数组)
2.sort() 方法默认是按字符来排序的,所以在对数字型数组排序时,不可想当然的以为会按数字大小排序!
3. 要改变默认的 sort 行为 (即按字符排序),可以自行指定排序规则函数 (如本例所示)
希望本文所述对大家 JavaScript 程序设计有所帮助。
来源: