js排序的几种方法

125 阅读2分钟

1.冒泡排序

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

<script>
        function bubbleSort(arr){
            var len = arr.length;//数组长度
            for(var i=0; i<len-1; i++){
                //将最大的数存放至倒数第一位
                for(var j=0; j<len-1-i; j++){
                    if(arr[j]>arr[j+1]){
                        var temp = arr[j+1];//将小的数存放到temp中
                        arr[j+1] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            return arr;
        }
        var arr1 = [200,3,4,6,9,10,5,7,11,45];
        bubbleSort(arr1)
        for(var i=0;i<arr1.length; i++){
            document.write(arr1[i] + "<br />")
        } 
</script>

674442c54b7d45cc83a5f2fb96249417.gif

2.选择排序

<script>
        //思路:标记索引[从小到大/从大到小]
        var arr1 = [200,3,4,6,9,10,5,7,11,45];
        function selectionSort(arr){
            var len = arr.length;//数组长度
            var minIndex,temp;//minIndex存放最小的索引  temp:临时变量
            for(var i=0; i<len; i++){
                minIndex = i;//假设
                for(var j = i+1; j<len; j++){
                    if(arr[j]<arr[minIndex]){
                        minIndex = j
                    }
                }
                temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp
            }
            return arr;
        }
        console.log(selectionSort(arr1))
    </script>

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

a54012e5285f4190986272b44daecedc.gif

31a2106e2b1348f4a25b4eba596a93ec.png

3.插入排序

<script>
        function insertionSort(arr) {
            var len = arr.length;//数组长度
            var preIndex, current;//前一位  当前
            for (var i = 1; i< len; i++) {
                preIndex = i-1;
                current = arr[i];
                while(preIndex >=0 && arr[preIndex] >current) {
                    arr[preIndex+1] = arr[preIndex];
                    preIndex--;
                }
                arr[preIndex+1] = current;
            }
            return arr;
        }
        var arr1 = [200,3,4,6,9,10,5,7,11,45];
        console.log(insertionSort(arr1))
    </script>

每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

b87af57202034c6f96f7acb622bdb958.gif

78a06d81185c4abab74bc8a8fb076da0.png

4.归并排序

将两个顺序序列合并成一个顺序序列的方法。

image.png image.png

35dfba5ecdd44e7680ef37e5e734b46f.gif

5c5a550524a84cb9a9f3fcb66771bda0.png

5.快速排序

首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

image.png

9ab964858d5f4ee5904104dae07793ec.gif

6.sort()排序

传入参数,实现升序,降序;

image.png

各种排序的速度性能(10万数据)

1.快速排序 cutoff5—>30-50ms cutoff10 —>30-60ms cutoff50 ---->40-50ms cutoff3效果不错—>30-50ms,30ms出现的机会很多 cutoff==0时(即不在分割长度短的时候转为插入排序),效果依然不错,30-50ms,30ms出现的很多

2.sort排序 55-70ms

3.归并排序耗时80-100ms

4.选择排序耗时5800ms左右

5.插入排序耗时10600ms左右

6.冒泡排序耗时26000ms左右