js数组的顺序排序、完全随机打乱排序 总结

2019-02-01 08:54:10

一、顺序排序

1、按字符编码排序:sort()


var testArray=[23,500,1000,300,34,-2]; 

testArray.sort(); 

alert(testArray); //-2,1000,23,300,34,500

1

2

3

2、将数组元素倒序排:reverse()


var testArray=[-2,53,34,300,500,1000]; 

testArray.reverse(); 

alert(testArray); //1000,500,300,34,53,-2

1

2

3

3、在sort()里面加个比较函数(从小到大排)


var testArray=[23,500,1000,300,34,-2]; 

//传给sort一个比较函数,如果比较函数return值小于0,则表示a必须出现在b前面,否则在b后面。

testArray.sort(function(a,b){return a-b;}); 

alert(testArray); //-2,23,34,300,500,1000

1

2

3

4

4、快速排序 

效率相比上面的方法最高。 

看不懂下面代码的话可以参考:快速排序(Quicksort)的Javascript实现


var testArray=['df', 'rtr', 'wy', 'dafd', 'dfs', 'wefa', 'tyr', 'rty', 'rty', 'ryt', 'afds', 'wer', 'te']; 

var testArray2=[23,500,1000,300,34,-2]; 


//快速排序函数

var quickSort = function(arr) {

  if (arr.length <= 1) { return arr; }

  

  var pivotIndex = Math.floor(arr.length / 2);

  var pivot = arr.splice(pivotIndex, 1);//将基准分离出


  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));


};


//调用输出

alert(quickSort(testArray));//afds,dafd,df,dfs,rtr,rty,rty,ryt,te,tyr,wefa,wer,wy

alert(quickSort(testArray2)); //-2,23,34,300,500,1000

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

二、随机打乱排序(乱序)

1、低效版:


原理:和上面数组排序的2原理一样,让比较函数随机传回-1或1即可。 

这种方法打乱10000个元素的数组,所用时间大概在35ms上下,比较低效。


var testArray=[-2,23,34,300,500,1000]; 

testArray.sort(function(){return Math.random()>0.5?-1:1;}); 

alert(testArray); //结果不唯一

1

2

3

2、高效版: 

(1)洗牌算法: 

这种方法打乱10000个元素的数组来测试仅需要7,8毫秒的时间。


var testArray=[-2,23,34,300,500,1000]; 

if (!Array.prototype.derangedArray) {

    Array.prototype.derangedArray = function() {

        for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);

        return this;

    };

}

alert(testArray.derangedArray());//结果不唯一

1

2

3

4

5

6

7

8

(2)这个简单明了,且复杂度为 O(n)


function shuffle(arr) {

    var len = arr.length;

    for (var i = 0; i < len - 1; i++) {

        var index = parseInt(Math.random() * (len - i));

        var temp = arr[index];

        arr[index] = arr[len - i - 1];

        arr[len - i - 1] = temp;

    }

    return arr;

}

var arr = [-2,1,3,4,5,6,7,8,9];

console.log(shuffle(arr));//结果不唯一





  • 2021-01-08 16:49:59

    CommonJs 与 ESModule区别

    node中模块导入require是一个内置的函数,因此只有在运行后我们才可以得知模块导出内容,无法做静态分析

  • 2021-01-08 16:54:08

    如何在 Node.js 中使用 import / export 的三种方法

    注:第1、2种方法均是借助 babel,需要注意的是文章使用的babel版本 < 7。从 babel 7.X 版本开始,部分包名、用法发生了些许变化,大体与7之前的用法类似,详细请到官方手册学习 7.X 版本的改动(Babel 踩坑总结(三) —— 7.X 版本升级是我对 7.X 版本三大改动的总结)

  • 2021-01-10 17:19:00

    libc++_shared是什么冲突

    NDK 支持多种 C++ 运行时库。本文档介绍了这些库的相关信息、所涉及的折衷做法以及库的使用方法。

  • 2021-01-10 17:20:52

    NDK--CMakeLists配置第三方so库

    当我们创建一个NDK工程时,会自动创建一个CMakeLists.txt的文件,在AS中c++的编译器是使用LLVM,规则为cmake,今天来学习下cmake的基本套路 首先,我创建了两个NDK工程,第一个工程为lib,为第二个工程提供so库

  • 2021-01-12 10:56:09

    NodeJS封装mongodb

    NodeJS操作 Mongodb 并且对 Mongodb 类库进行封装