成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javaScript排序算法學習筆記

lentoo / 1813人閱讀

摘要:排序算法學習筆記用于創(chuàng)建數(shù)組冒泡排序冒泡排序比較任何兩個相鄰的項,如果第一個比第二個大,則交換它們。歸并排序歸并排序是一種分治算法。完成下列操作的前提是數(shù)組均已經(jīng)完成。

javaScript排序算法學習筆記
// 用于創(chuàng)建數(shù)組
function createNonSortedArray(size) {
    var array = new ArrayList();
    for( var i = size; i>0; i--) {
        array.insert(i);
    }
    return array;
}

function ArrayList() {
    var array = [];

    this.insert = function(item) {
        console.log(item, "insert");
        array.push(item);
    }

    this.toString = function() {
        console.log("tostring");
        return array.join();
    }
    /*
    * 冒泡排序
    * 冒泡排序比較任何兩個相鄰的項,如果第一個比第二個大,則交換它們。
    * 元素項向上移動至正確的順序,就好像氣泡升至表面一樣,冒泡排序因此得名。
    * 第一輪比過之后最后一個就一定是最大的 無需再比較。所以下次要 - i
    */ 
    this.bubbleSort = function() {
        var length = array.length;
        for(var i = 0;i array[j + 1]) {
                    swap(array, j, j+1);
                }
            }
        }
    }

    /*
    * 選擇排序
    * 選擇排序算法是一種原址比較排序算法。選擇排序大致的思路是找到數(shù)據(jù)結(jié)構(gòu)中的最小值
    * 并將其放置在第一位,接著找到第二小的值并將其放在第二位,以此類推。比如,第一個
    * 的時候,會遍歷后面所有想跟其比較,找到最小的更其交換。所以第一個此時一定是最小的。
    * 隨意第二個的時候,只會循環(huán)后面的幾個。如果找到一個比第二個更小的,那么交換位置。
    */ 
    this.selectionSort = function() {
        var length = array.length,
        indexMin;
        for(var i = 0;i< length - 1;i++) {
            indexMin = i;
            for(var j = i;jarray[j]) {
                    indexMin = j;
                }
            }
            if (i !== indexMin) {
                swap(array, i, indexMin);
            }
        }
    }

    /*
    * 插入排序
    * 插入排序每次排第一個數(shù)組項,以此方式構(gòu)建最后的排序數(shù)組。假定第一項已經(jīng)排序了,接著,
    * 它和第二項進行比較,第二項是應該待在原位還是插到第一項之前呢?這樣,頭兩項就已正確
    * 排序,接著和第三項比較(它是該插入到第一、第二還是第三位置呢?),以此類推。
    * 簡而言之,就是遍歷數(shù)組的每一項,拿這一項去跟前面的項比較,如果比他小就插入到它前面。
    */ 
    this.insertionSort = function() {
        var length = array.length,
        j,temp;
        for (var i = 1;i0 && array[j-1] > temp) {
                array[j] = array[j - 1];
                j--;
            }
            array[j] = temp;
        }
    }

    // 歸并排序
    // 歸并排序是一種分治算法。其思想是將原始數(shù)組切分成較小的數(shù)組,直到每個
    // 小數(shù)組只有一個位置,接著將小數(shù)組歸并成較大的數(shù)組,直到最后一個排序完畢的大數(shù)組。
    this.mergeSort = function() {
        array = mergeSortRec(array);
    }

    var mergeSortRec = function(array) {
        var length = array.length;
        if (length === 1) {
            return array;
        }
        var mid = Math.floor(length / 2),
        left = array.slice(0, mid),
        right = array.slice(mid, length);

        return merge(mergeSortRec(left), mergeSortRec(right));
    }

    var merge = function(left, right) {
        var result = [],
        il = 0,
        ir = 0;
        // 完成下列操作的前提是left、right數(shù)組均已經(jīng)完成。所以采用遞歸的形式
        // 在數(shù)組長度為1的時候先開始排序,然后在通過merge left與right數(shù)組
        while(il < left.length && ir < right.length) {
            if (left[il] < right[ir]) {
                result.push(left[il++]);
            } else {
                result.push(right[ir++]);
            }
        }
        // 上面是將left與right數(shù)組排完序,那么其中之一數(shù)組必然為空,
        // 下面的操作就是將剩下的right或者left全部推入result數(shù)組中
        while(il < left.length) {
            result.push(left[il++]);
        }

        while(ir < right.length) {
            result.push(right[ir++]);
        }

        return result;
    }

    // 快速排序
    // 首先,從數(shù)組中選擇中間一項作為主元
    // 創(chuàng)建兩個指針,左邊一個指向數(shù)組的第一項,右邊一個指向數(shù)組的最后一個項。
    // 移動左指針直到我們找到一個比主元大的元素,接著,移動右指針直到找到一個
    // 比主元小的元素,然后交換他們,重復這個過程,直到左指針超過右指針。這個
    // 過程將使得比主元小的值都排在主元之前,而比主元大的值都排在主元之后。這一步
    // 叫做劃分操作。
    // 接著,算法對劃分后的小數(shù)組(較主元小的值組成的子數(shù)組,以及較主元大的值
    // 組成的子數(shù)組)重復之前的兩個步驟,直到數(shù)組已完全排序。

    // 簡而言之,先分治,不斷的細化下去,到最后一個數(shù)組無法再交換位置進行排序位置
    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 pivot = array[Math.floor((left + right) / 2)],
        i = left,
        j = right;

        while(i <= j) {
            while(array[i] < pivot) {
                i++;
            }
            while(array[j] > pivot) {
                j--;
            }
            if (i <= j) {
                swap(array, i, j);
                i++;
                j--;
            }
        }

        return i;
    }

    var swap = function(array, index1, index2) {
        var aux = array[index1];
        array[index1] = array[index2];
        array[index2] = aux;
    }
}

var array = createNonSortedArray(9);
console.log(array.toString());
array.bubbleSort();
// array.selectionSort();
// array.insertionSort();
// array.mergeSort();
// array.quickSort();
console.log(array.toString());

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109127.html

相關(guān)文章

  • 優(yōu)秀程序員都應該學習的 GitHub 上開源的數(shù)據(jù)結(jié)構(gòu)與算法項目

    摘要:強烈推薦上值得前端學習的數(shù)據(jù)結(jié)構(gòu)與算法項目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會的個代碼實現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會走得...

    cheukyin 評論0 收藏0
  • JavaScript學習筆記 - 基礎(chǔ)排序算法

    摘要:本文記錄了我在學習前端上的筆記,方便以后的復習和鞏固。冒泡排序算法步驟比較相鄰的元素。這步做完后,最后的元素會是最大的數(shù)。重復第二步,直到所有元素均排序完畢。得到序列第二趟,,和進行交換。 本文記錄了我在學習前端上的筆記,方便以后的復習和鞏固。推薦大家去看看這一本gitBook上的書十大經(jīng)典排序算法本文就是看這本書記錄的筆記。 冒泡排序 1.算法步驟 1.比較相鄰的元素。如果第一個比第...

    mindwind 評論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項目看到原文。列舉了一些很實用的技巧,比如給空內(nèi)容的標簽添加內(nèi)容,逗號分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學者更好的掌握排序算法的實現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅持練習、學習與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...

    DangoSky 評論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項目看到原文。列舉了一些很實用的技巧,比如給空內(nèi)容的標簽添加內(nèi)容,逗號分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學者更好的掌握排序算法的實現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅持練習、學習與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...

    zgbgx 評論0 收藏0
  • Javascript常見排序算法筆記

    摘要:排序算法主要針對的是數(shù)組,所以,在開始學習之前,我們先自己新建一種數(shù)據(jù)結(jié)構(gòu)來方便我們的學習。統(tǒng)計執(zhí)行次數(shù)冒泡排序比較相鄰兩個數(shù)的大小,如果前面的數(shù)大于后面,則交換這兩個數(shù)的位置。所以我們把數(shù)列分割成不超過兩個元素的數(shù)組,然后將其合并。 ??排序算法主要針對的是數(shù)組,所以,在開始學習之前,我們先自己新建一種數(shù)據(jù)結(jié)構(gòu)來方便我們的學習。 function ArrayData () { l...

    617035918 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<