排序

2018-01-31  本文已影响0人  HE_Zoro

比较两个相邻的数,不过不符合排序规则则交换这两个数的位置(比如升序,前一个比后一个大,则交换位置)。这样一轮下来,最大(或最小)的数就在最后了。在对数组剩下的数重复上述过程,直到排序完成。

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

function swap(arr,left,right){
    var temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
}

var arr = [1,5,2,9,2,3,45,21,64,23,7,5]
bubbleSort(arr)
console.log(arr)

与冒泡排序类似,也是比较两个相邻的数,但不交换,只是对最小(或最大)的数进行标记,一轮比较完毕后再将最小(或最大)的数放在正确的位置。

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

function swap(arr,left,right){
    var temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
}

var arr = [1,5,2,9,2,3,45,21,64,23,7,5]
selectSort(arr)
console.log(arr)

插入排序有点类似打牌时,我们一张一张的拿牌,按顺序放好,新拿的牌再插入到已经排好序的牌里。

function insertSort(arr){
    for(var i=0; i<arr.length; i++){
        var value = arr[i];
        for(j=i-1; j>-1&&arr[j]>value; j--){
            arr[j+1]=arr[j]
        }
        arr[j+1] = value//因为在执行j--后不满足条件才退出for循环,所以这时是arr[j+1]
    }
    return arr
}
var arr = [1,5,2,9,2,3,45,21,64,23,7,5]
insertSort(arr)
console.log(arr)

其基本思想是将两个已经排序好的数组合并,要比对所有的元素排序来的快。因此,可将数组依次拆开,再不断的两两合并,直至排序完成。

function mergeSort(arr){
    if(arr.length < 2){
        return arr
    }

    var middle = Math.floor(arr.length/2)
    var left = arr.slice(0,middle);
    var right = arr.slice(middle);

    return merge(mergeSort(left),mergeSort(right))
}

function merge(arrLeft,arrRight){
    var result = [];
    var i = 0, j = 0;
    while(i < arrLeft.length && j < arrRight.length){
        if(arrLeft[i] < arrRight[j]){
            result.push(arrLeft[i++])
        }else{
            result.push(arrRight[j++])
        }
    }
    return result.concat(arrLeft.slice(i)).concat(arrRight.slice(j))
}

var arr = [1,5,2,9,2,3,45,21,64,23,7,5]
mergeSort(arr)
console.log(mergeSort(arr))
function quickSort(arr,left,right){
    if(arr.length< 2){
        return arr
    }
    if(typeof left != 'number'){
        left = 0
    }
    if(typeof right != 'number'){
        right = arr.length-1
    }
    var index = partition(arr,left,right)
    if(left<index-1){
        quickSort(arr,left,index-1)
    }
    if(index<right){
        quickSort(arr,index,right)
    }
    return arr
}

function partition(arr,left,right){
    var middle = Math.floor((left+right)/2)
    var pivot = arr[middle]
    var i = left, j =right;
    while(i<=j){
        while(arr[i]<pivot){
            i++
        }
        while(arr[j]>pivot){
            j--
        }
        if(i<=j){
            swap(arr,i,j)
            i++
            j--
        }
    }
    return i
}

function swap(arr,left,right){
    var temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
}


var arr = [1,5,2,9,2,3,45,21,64,23,7,5]
quickSort(arr)
console.log(arr)

(先这样吧,困死,明天在把桶排和基数排序补上)

上一篇下一篇

猜你喜欢

热点阅读