摘要:快速排序看名字知特點就是快效率高它是處理大數據最快的排序算法之一奇妙的記憶點內排序不穩定基本思想通過一趟排序把待排序記錄分為獨立的兩部分其中一部分記錄的關鍵字都比另一部分的關鍵字笑則分別對兩部分繼續進行排序以達到整個序列有序自己的理解其實就
快速排序(Quick Sort)
看名字知特點,就是快,效率高.它是處理大數據最快的排序算法之一.
奇妙的記憶點:
內排序
不穩定
基本思想通過一趟排序把待排序記錄分為獨立的兩部分,其中一部分記錄的關鍵字都比另一部分的關鍵字笑,則分別對兩部分繼續進行排序,以達到整個序列有序.
自己的理解:
其實就是用分治法的思路,將一個數組分為兩半,進行無線分割排序.
首先在數列中取一個值,成為"關鍵字/基準"(pivot);
然后比它小的放前面,大的放后面,相同的話隨便放.
遞歸的把我們分為兩半的數組再次分半排序.
//方法一 function quickSort(array, left, right) {//傳入參數為數組,left,right為排序區域下標 console.time("1.快速排序耗時"); if (Object.prototype.toString.call(array).slice(8, -1) === "Array" && typeof left === "number" && typeof right === "number") {//判斷傳入參數的正確性 if (left < right) { //正確性判斷 var x = array[right], i = left - 1, temp;//x變量為待排序數組末尾 for (var j = left; j <= right; j++) { //從左到右 if (array[j] <= x) { i++;//注意i先增在交換 temp = array[i]; array[i] = array[j]; array[j] = temp; } } quickSort(array, left, i - 1); quickSort(array, i + 1, right); } console.timeEnd("1.快速排序耗時"); return array; } else { return "array is not an Array or left or right is not a number!"; } } //方法二 var quickSort2 = function(arr) { console.time("2.快速排序耗時"); if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); var pivot = arr.splice(pivotIndex, 1)[0]; var left = []; var right = []; for (var i = 0; i < arr.length; i++){ if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } console.timeEnd("2.快速排序耗時"); return quickSort2(left).concat([pivot], quickSort2(right)); }; var arr=[3,49,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(quickSort(arr,0,arr.length-1));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50] console.log(quickSort2(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
best condition: T(n) = O(nlog n)
baddest condition: T(n) = O(n^2)
average condition: T(n) = O(nlog n)
歸并排序(Merge Sort)不受輸入數據影響,但是表現比選擇排序好.代價是需要額外的內存空間.
奇妙的記憶點:
外排序(需要額外的內存空間)
穩定的排序算法(排序后元素原始順序不會變化)
基本思想:分治法(Divide and Conquer)
將已有序的子序列合并,從而得到完全有序的序列.也稱為2-路歸并.
歸并排序:代碼function mergeSort(arr) { //采用自上而下的遞歸方法 var len = arr.length; //獲取傳入數組的長度 if(len < 2) { //如果為單個元素則直接返回 return arr; } var middle = Math.floor(len / 2),//取中點 left = arr.slice(0, middle), //取左邊區間 right = arr.slice(middle); //取右邊區間 return merge(mergeSort(left), mergeSort(right));//調用歸并函數 } function merge(left, right)//傳入兩個區間 { var result = [];//新建變量用于保存結果 console.time("歸并排序耗時"); while (left.length && right.length) { //當左區間右區間存在時 if (left[0] <= right[0]) { //將區間中較小的一位從區間數組中放到結果數組中. result.push(left.shift()); } else { result.push(right.shift()); } } //下面兩個while是為了解決遺留元素問題 while (left.length) result.push(left.shift()); while (right.length) result.push(right.shift()); console.timeEnd("歸并排序耗時"); return result;//返回結果 } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(mergeSort(arr)); /*10次歸并 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms 歸并排序耗時: 0ms [ 2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50 ] */
best condition: T(n) = O(n)
baddest condition: T(n) = O(nlog n)
average condition: T(n) = O(nlog n)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80445.html
摘要:奇妙的記憶點不穩定內排序基本思想分為兩步建堆與維持堆的性質首先我們要先理解堆是什么東西堆其實就是一個完全二叉樹我們可以使用順序表存儲一個二叉樹如下圖所示來存儲其中分為最大堆最小堆而最大堆就是上頭大下頭小最小堆則反之明白了堆的定義我們就可以開 奇妙的記憶點: 不穩定 內排序 基本思想: 分為兩步,建堆與維持堆的性質,首先我們要先理解堆是什么東西.堆其實就是一個完全二叉樹,我們可以使用...
摘要:下面會介紹的一種排序算法快速排序甚至被譽為世紀科學和工程領域的十大算法之一。我們將討論比較排序算法的理論基礎并中借若干排序算法和優先隊列的應用。為了展示初級排序算法性質的價值,我們來看一下基于插入排序的快速的排序算法希爾排序。 前言 排序就是將一組對象按照某種邏輯順序重新排列的過程。比如信用卡賬單中的交易是按照日期排序的——這種排序很可能使用了某種排序算法。在計算時代早期,大家普遍...
摘要:兩個單元素數組的合并實際就是對這兩個數進行了排序,即變為,同樣再對后一組的兩個數歸并排序,即變為,再將兩單元數組歸并成四單元數組即和歸并為。 前言 本周講解兩個50多年前發明,但今天仍然很重要的經典算法 (歸并排序和快速排序) 之一 -- 歸并排序,幾乎每個軟件系統中都可以找到其中一個或兩個的實現,并研究這些經典方法的新變革。我們的涉及范圍從數學模型中解釋為什么這些方法有效到使這些算法...
閱讀 1740·2021-11-25 09:43
閱讀 1785·2021-11-24 10:41
閱讀 3105·2021-09-27 13:36
閱讀 811·2019-08-30 15:53
閱讀 3567·2019-08-30 15:44
閱讀 866·2019-08-30 14:03
閱讀 2572·2019-08-29 16:38
閱讀 996·2019-08-29 13:23