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





  • 2020-12-01 16:10:12

    IntelliJ IDEA之代理配置 anyproxy

    网络号,真是太爽了,真的,如果又了好的网络,开发真是事半功倍,所以,大家开发前,一定要把自己的网络给整好。 会给你节省不少时间呢。

  • 2020-12-01 16:14:54

    HTTP状态码429的含义

    发生429是服务器接口并发太多引起的,可根据代码进行修改,放开限制次数

  • 2020-12-01 16:19:26

    vue中动画分布解析

    enter, enter-active, enter-active-to, (开始 进入阶段的)第1帧 属性值,到 (默认属性值 的过渡阶段),移除enter动画, leave, leave-active, leave-active-to (开始 离开 阶段的)第1帧 默认属性值,到 (属性值 的过渡阶段),移除leave动画

  • 2020-12-01 16:21:47

    Meteor与express结合开发

    Meteor本质上是一个已经公开了连接 http服务器的节点应用程序,这意味着您可以像下面这样定义服务器路由:,如果您坚持使用Express,则可以将Express路由注册为Connect中间件,如下所示:

  • 2020-12-01 16:25:32

    nuxtjs引入jquery

    nuxt引入jQuery库 nuxtjs如何添加 Webpack 插件?

  • 2020-12-01 16:43:37

    fieldset标签做输入框

    比如 vuetify中的 input组件,就用到了fieldset做边框, 这个时候我们想改边框,却找不到border,因为fieldset是靠color来修改边框颜色的。