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));//结果不唯一





  • 2018-08-28 15:09:50

    JAVA中MAP值保持顺序不变

    今天在进行JAVA开发过程中,因需要使用MAP来存放数据,同时希望MAP中KEY的顺序与放入顺序保持一致。 在使用HashMap之后,发现KEY的顺序是乱序的,每次打印还不太一样。上网查询资料之后发现:

  • 2018-09-03 13:57:27

    load average 的含义

    一般的进程需要消耗CPU、内存、磁盘I/O、网络I/O等资源,在这种情况下,平均负载就不是单独指的CPU使用情况。即内存、磁盘、网络等因素也可以影响系统的平均负载值。 在单核处理器中,平均负载值为1或者小于1的时候,系统处理进程会非常轻松,即负载很低。当达到3的时候,就会显得很忙,达到5或者8的时候就不能很好的处理进程了(其中5和8目前还是个争议的阈值,为了保守起见,建议选择低的)。

  • 2018-09-05 01:42:03

    git reset 回退以前某个版本及常用命令

    第一个命令只删除所有untracked的文件,如果文件已经被tracked, 修改过的文件不会被回退。而第二个命令把tracked的文件revert到前一个版本,对于untracked的文件(比如编译的临时文件)都不会被删除。

  • 2018-09-08 16:04:25

    Android SQLiteDatabase使用详细教程

    Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。SQLiteDatabase的常用方法方法名称方法表示含义openOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)

  • 2018-09-09 02:25:09

    单例模式的好处和缺点?为什么要用单例模式?

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。