js实现冒泡排序、插入排序、选择排序、快速排序(升序)

生成1-100的随机数:

        function getArr() {
            var arr = [];
            for (var i = 0; i < 10; i++) {
                arr.push(Math.floor(Math.random() * (99) + 1));
            }
            return arr;
        }

冒泡排序,大致思路就是找出最大的值冒泡到后面去,最大的冒泡到最后一位,第二大的冒泡到倒数第二位这样,从第一个数开始向后面冒泡,遇到比它大的数就交换位置(比如第一个数的值大于第二个数的值,那么第一个数就和第二个数交换位置),这样一直冒泡下来,经过第一遍冒泡,最后一位数就是最大的.....

       function bubble(arr) {
            var i, len = arr.length,
                j, item;
            for (i = 0; i < len; i++) {
                for (j = 0; j < len - 1 - i; j++) {
                    if (arr[j] > arr[j + 1]) {
                        item = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = item;
                    }
                }
            }
            return arr;
        }

        var arr = getArr();
        console.log(bubble(arr));

 

选择排序:大致思路就是先找出最小的值,然后和第一个数交换位置,然后找出第二小的值,然后和第二个数交换位置....

       function selectSort(arr) {
            var len = arr.length;
            var min, item;
            for (var i = 0; i < len; i++) {
                min = i;
                for (var j = i + 1; j < len; j++) {
                    if (arr[j] < arr[min])
                        min = j;
                }
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
            return arr;
        }

        arr = getArr();
        console.log(selectSort(arr));

插入排序:

        function insertSort(arr) {
            var len = arr.length,
                j, current;
            for (var i = 1; i < len; i++) {
                j = i;
                current = arr[i]; //保留当前的值
                while (j > 0 && arr[j - 1] > arr[j]) {
                    arr[j] = arr[j - 1];
                    j--;
                }
                arr[j] = current;
            }
            return arr;
        }

        arr = getArr();
        console.log(selectSort(arr));

运行过程:

例如arr=[6,5,2,7,1],运行时,i=1,j=1,current=5,那么第一回while变化过程如下:

arr[0]>arr[1],arr变为[6,6,2,7,1],j=0,跳出while循环,然后通过arr[j] = current;变为[5,6,2,7,1]

第二回while变化过程如下:

i=2,j=2,current=2,6>2所以arr变为[5,6,6,7,1],j=1,6>5,所以arr变为[5,5,6,7,1],然后通过arr[j] = current;变为[2,5,6,7,1]

第三回通过while变化arr变为[2,5,6,7,1],然后通过arr[j] = current;变为[2,5,6,7,1]......

 

快速排序

快速实现简单版:

      function ps(arr) {
            if (arr.length <= 1) {
                return arr;
            }
            let pivotIndex = Math.floor(arr.length / 2);
            let pivot = arr.splice(pivotIndex, 1)[0];
            let left = [];
            let right = [];
            for (let i = 0; i < arr.length; i++) {
                if (arr[i] < pivot) {
                    left.push(arr[i]);
                } else {
                    right.push(arr[i]);
                }
            }
            return ps(left).concat([pivot], ps(right));
        }

快速实现复杂版: 

        function quickSort(arr, left, right) {
            var len = arr.length;
            var partitionIndex,
                left = typeof left != 'number' ? 0 : left,
                right = typeof left != 'number' ? 0 : right;

            if (left < right) {
                partitionIndex = partition(arr, left, right);
                quickSort(arr, left, partitionIndex - 1);
                quickSort(arr, partitionIndex + 1, right);
            }
            return arr;
        }

        function partition(arr, left, right) {//找到基准位置
            var pivot = left;
            index = pivot + 1;
            for (var i = index; i <= right; i++) {
                if (arr[i] < arr[pivot]) {
                    swap(arr, i, index);
                    index++;
                }
            }
            swap(arr, pivot, index - 1);
            return index - 1;
        }

        function swap(arr, i, j) {
            var item = arr[i];
            arr[i] = arr[j];
            arr[j] = item;
        }
        arr = getArr();
        console.log(quickSort(arr, 0, 9));

假设arr=[4,1,3,6,2],left=0,right=4

那么第一次partition,变化过程为:

povit=0,

index=1,i=1,arr=[4,1,3,6,2],

index=2,i=2,arr=[4,1,3,6,2],

index=3,i=3,arr=[4,1,3,6,2],

index=3,i=4,arrr=[4,1,3,2,6],

index=4,i=5(出for循环),

然后arrr=[2,1,3,4,6],返回3

 

那么数组前一部分[2,1,3](0,2)通过第二次partition,变化为:

povit=0,

index=1,i=1,arr=[2,1,3],

index=2,i=2,arr=[2,1,3],

index=2,i=3(出for循环),

然后arr=[1,2,3],返回1

 

那么[2](4,4)通过第三次partition,变化为:

povit=4,index=5,i=5...

 

纵观partition的运行过程,如果arr=[4,1,3,6,2],那么就是[4,1,3,2,6]--》[2,1,3,4,6],要是数组再多几个数,

如果arr=[4,1,3,2,6,7,8,1],那么就是[4,1,3,2,6,7,8,1]--》[4,1,3,2,1,7,8,6]--》[1,1,3,2,4,7,8,6]

index记录的永远是最后一个小于基准的数所在位置+1(比如上例就是6所在位置),当遇到有比基准小的数时(上例为1),数组就把该数和比基准大的数交换位置(1和6交换),然后index+1

所以partition做的事情就是以第一个数为基准,从第二个数开始,把比它小的数向前排在一起,比它大的数向后排在一起(比如第一次partition的变化过程就是[4,1,3,6,2]---》[4,1,3,6,2]---》4,1,3,6,2]---》[4,1,3,2,6]),然后找到最后一个小于它的数所在位置(2所在位置),然后把它和最后一个小于它的数进行交换([4,1,3,2,6]---》[2,1,3,4,6]),这样一来,左边就是小于基准的数,右边就是大于基准的数,然后再把比它小的数进行排序,比它大的数进行排序......

 

参考文档:

JS的十大经典算法排序

 

你可能感兴趣的:(数据结构和算法)