JS六種排序算法

// 冒泡排序
// 循環的最大值從length遞減
// 基本就是每次循環只能排好最後一個 而後遞減到第一個shell

function bubbleSort(){
var changedData = new Array();
var index = 0;
    console.log("冒泡調用");
    for (var j = a.length; j >0 ; j--) {
        for (var i = 0; i < j; i++) {
            if(a[i]>a[i+1]){
                var z = 0;
                z = a[i+1];
                a[i+1] = a[i];
                a[i] = z;
            }
            changedData[index] = a.toString();
            index++;
        }//one            
    }//two
    showDateChange(changedData);
}

// 選擇排序
// 外循環 j選取當前元素 到length-1
// 內循環 j+1開始 到length 逐個比較出最小值min
// 交換 min 和 a[j]數組

function selectionSort(){
var changedData = new Array();
var index = 0;
    console.log("選擇調用");
    for (var j = 0; j < a.length-1; j++) {
        var min = a[j];
        var minIndex = j;
        for (var i = j+1; i < a.length; i++) {
            if(a[i] < min) {
                min = a[i];
                minIndex = i;
            }
        }//one
        a[minIndex] = a[j];
        a[j] = min;
        // 
        changedData[index] = a.toString();
        index++;
    }//two
    showDateChange(changedData);
}

// 插入排序
// 從下標1開始 日後選擇直到最後
// 每一個選中的和他前面的全部比較
// 直到找到比他小的 排在他後面
// 至關於從1開始 每次都排好以前的i+1個 直到length
// 和冒泡相反ui

function insertionSort(){
var changedData = new Array();
var index = 0;
    console.log("插入排序");
    for (var j = 1; j < a.length; j++) {
        var now = a[j];
        var i = j - 1;
        while(i>=0 && now<a[i]){
            // 向後移數組
            a[i+1] = a[i];
            i--;
        }//one
        a[i+1] = now;
        changedData[index] = a.toString();
        index++;
    }//two
    showDateChange(changedData);
}

// 希爾排序
// 間隔改變的插入排序
// 傳統插入排序 比較前面的相鄰對象
// 希爾排序比較前面的第h個對象 直到h間隔不存在更改
// 改變h 直到 h=1code

function shellSort(){
var changedData = new Array();
var index = 0;
    console.log("希爾排序");
    var N = a.length;
    var h = 1;
    if (h < N/3) {
        h = h*3 + 1;//設置間隔
    }
    while(h > 0){
        for (var j = h; j < a.length; j++) {
            for (var i = j;i >= h && a[i] < a[i-h]; i -= h) {
                var z;
                z = a[i];
                a[i] = a[i-h];
                a[i-h] = z;
                // 
                changedData[index] = a.toString();
                index++;
            }
        }
        h = (h-1)/3;//改變間隔
    }
    showDateChange(changedData);
}

// 歸併排序
// 數據分爲 step爲間隔的小數組
// 將小數組排序 step變大 直到爲1/2個數組
// 將先後兩個已排序的數組 再排序對象

function mergeSort(arr){
var changedData = new Array();
    console.log("歸併排序");
    if (arr.length < 2) {
        return;
    }
    var step = 1;
    var left;
    var right;
    while(step < arr.length){
        left = 0;
        right = step;
        while(right + step <= arr.length){
            mergeArrays(arr,left,left+step,right,right+step);
            left = right + step;
            right = left + step;
        }
        if (right < arr.length) {
            mergeArrays(arr,left,left+step,right,arr.length);
        }
        step *= 2;
    }
    function mergeArrays(arr,startLeft,stopLeft,startRight,stopRight){
        var leftArray = new Array(stopLeft - startLeft +1);
        var rightArray = new Array(stopRight - startRight +1);
        k = startRight;
        for (var i = 0; i < rightArray.length-1; i++) {
            rightArray[i] = arr[k];
            k++;
        }
        k = startLeft;
        for (var i = 0; i < leftArray.length-1; i++) {
            leftArray[i] = arr[k];
            k++;
        }
        rightArray[rightArray.length-1] = Infinity;
        leftArray[leftArray.length-1] = Infinity;
        var m = 0;
        var n = 0;
        for (var k = startLeft; k < stopRight; k++) {
            if (leftArray[m] <= rightArray[n]) {
                arr[k] = leftArray[m];
                m++;
            }else{
                arr[k] = rightArray[n];
                n++;    
            }
        }
        arr += "";//轉化爲字符串
        changedData.push(arr);
    }
    showDateChange(changedData);
}

// 快速排序
// 沒實現可視化排序排序

function quickSort(){
    console.log("快速排序");
    function qSort(list){
        if (list.length == 0) {
            return list;
        }
        // 選取基數
        var pivotIndex = Math.floor(list.length/2);
        var pivot = list.splice(pivotIndex,1)[0];

        var left = [];
        var right = [];
        for (var i = 0; i < list.length; i++) {
            if (list[i] > pivot) {
                right.push(list[i]);
            }else{
                left.push(list[i]);
            }
        }
        // 遞歸 更換基數 而且排序其左右
        return qSort(left).concat([pivot],qSort(right));
    }
    a = qSort(a);
    showDate();
}
相關文章
相關標籤/搜索