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





  • 2017-02-24 15:04:10

    PHP 中的 9 个魔术方法

    这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。 这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在php特定事件下将会被触发。这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 last post,即我们使用一个构造器-使用这个作为我们第一个例子

  • 2017-02-24 15:06:18

    PHP 中的 9 个魔术方法

    这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。 这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在php特定事件下将会被触发。这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 last post,即我们使用一个构造器-使用这个作为我们第一个例子

  • 2017-02-24 15:07:05

    PHP 中的 9 个魔术方法

    这个标题有点牵强因为php有不只9种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。 这些'魔术'方法拥有者特殊的名字,以两个下划线开始,表示这些方法在php特定事件下将会被触发。这可能听起来有点自动魔法但是它真的很酷的,我们已经看过一个简单的例子在 last post,即我们使用一个构造器-使用这个作为我们第一个例子

  • 2017-02-24 15:53:02

    PHP中__get()和__set()的用法实例详解

    在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,对每个字段进行set和get的操作。只需要加上两个魔术方法即可

  • 2017-02-24 16:53:58

    PHP 中的Closure

    Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的。匿名函数就是没有定义名字的函数。这点牢牢记住就能理解匿名函数的定义了。