高等排序(JavaScript)

归并排序

归并排序是一种分治算法,其思想是将原始数组切分成为较小的数组,知道每一个小树组只有一个位置,接着将小树组归并成为较大的数组,直到最后只有一个排序完毕的大数组。

1.将给定的包含n个元素的局部数组分割成为两个局部数组,每个数组包含n/2个元素
2.对两个数组执行排序
3.将排序好的两个数组整合成为一个大数组


这里写图片描述

快速排序

和归并排序一样,快速排序也使用分治的方法,将原始数组分 为较小的数组(但它没有像归并排序那样将它们分割开)。

(1) 首先,从数组中选择中间一项作为主元。
(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指 针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交 换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之 前,而比主元大的值都排在主元之后。这一步叫作划分操作。
(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的 子数组)重复之前的两个步骤,直至数组已完全排序。

实现过程

function ArrayList(){
    var array = [];
    this.insert = function(item){
        array.push(item);
    }

    this.toString = function(){
        return array.join();
    }
    this.bubbleSort = function(){//冒泡排序
        var t;
        var length = array.length;
        for (var i = 0; i < length; i++) {
            for (var j = 0; j < length-1; j++) {
                if(array[j] > array[j+1]){
                    t = array[j];
                    array[j] = array[j+1];
                    array[j+1] = t;
                }
            }
        }
    }
    this.selectionSort = function(){//选择排序
        var t;
        var length = array.length;
        for (var i = 0; i < length-1 ; i++) {
            for(var j = i+1; j < length ; j++){
                if(array[j] < array[i]){
                    t = array[i];
                    array[i] = array[j];
                    array[j] = t;
                }
            }
        }
    }
    this.insertionSort = function(){//插入排序
        var t;
        var length = array.length;
        for (var i = 1; i < length; i++) {
            var j = i;
            t = array[i];
            while(j > 0 && array[j-1] > t){
                array[j] = array[j-1];
                j--;
            }
            array[j] = t;
            console.log(array);
        }
    }
    /*归并排序*/
    this.mergeSort = function(){
        array = mergeSortSec(array);
    }
    var mergeSortSec = function(array){
        var length,mid,right,left;
        length = array.length;
        if(length === 1){
            return array;
        }
        mid = parseInt(length/2);
        left = array.slice(0,mid);
        right = array.slice(mid,length);
        console.log(left);
        return merge(mergeSortSec(left),mergeSortSec(right));
    }
    var merge = function(left,right){
        var result = [];
        var l=0,r=0;
        while(l<left.length && r<right.length){
            if(left[l] < right[r]){
                result.push(left[l++]);
            }else{
                result.push(right[r++]);
            }
        }
        while(left.length > l){
            result.push(left[l++]);
        }
        while(right.length > r){
            result.push(right[r++]);
        }
        return result;
    }
    /*快速排序*/
    this.quickSort = function(){
        quick(array, 0, array.length-1);
    }
    var quick = function(array, left, right){
        var index;
        if(array.length > 1){
            index = partition(array,left,right);
            if(left < index-1){
                quick(array ,left ,index-1);
            }
            if(index < right){
                quick(array, index ,right);
            }
        }
    }
    var partition = function(array, left, right){
        var cnt = array[parseInt((left + right)/2)],
            i = left,
            j = right,
            t;
        while( i <= j ){
            while (array[i] < cnt){
                i++;
            }
            while( array[j] > cnt){
                j--;
            }
            if( i <= j){
                t = array[j];
                array[j] = array[i];
                array[i] = t;
                j--;
                i++;
            }
        }
        return i;
    }
}

方法使用

var arr = new ArrayList();
arr.insert(9);
arr.insert(6);
arr.insert(7);
arr.insert(2);
arr.insert(5);
arr.insert(1);
arr.insert(8);
arr.insert(4);
arr.insert(3);
console.log(arr.toString());/*[9,6,7,2,5,1,8,4,3]*/
/*console.log(arr.bubbleSort());
arr.selectionSort();
arr.insertionSort();
arr.mergeSort();*/
arr.quickSort();
console.log(arr.toString());/*[1,2,3,4,5,6,7,8,9]*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值