作為一名合格的程式設計師,還是要懂一些排序演算法。
學習這個話題,通常都會先學氣泡排序,因為它在所有的排序演算法中是最簡單也是最**的。當然,簡單是不會有好結果的。它的效能也是最差的。
氣泡排序通過比較任何兩個相鄰的項,如果第乙個比第二個打,則交換它們。元素項向上移動至正確的順序,就好像氣泡從水中往上冒一樣。冒泡因此得名。
具體實現**:
function
bubblesort
(array)}}
}
上面**注釋部分是對冒泡演算法的優化:通過從內迴圈中減去外迴圈中一跑過的輪數,避免內迴圈中所有不必要的比較。
第二種演算法是選擇排序,選擇排序演算法是一種原址比較排序演算法。含義就是找到資料結構中的最小值並將其放置在第一位,接著找到第二小的值並將其放在第二位,以此類推。
實現**:
function
selectionsort
(array)
}if(i !== indexmin)
}}
第三種排序演算法是插入排序,插入排序比較好理解,現實生活中比較明顯的例子就是插牌。你鬥地主的時候,一手牌拿著,然後從第二張開始排列,跟前面的序列進行對比。如果比前面的小則插到前面。
實現**:
function
insertionsort
(array)
array[j] = temp;
}}
排序小型陣列時,此演算法比前面兩個效能要好。
第四種排序演算法是歸併排序,這也是第乙個可以被實際使用的排序演算法。歸併排序是一種分治演算法,思路是將原始陣列切分成比較小的陣列,直到每個小陣列只有乙個位置,接著將小陣列歸併成較大的陣列,直到最後只有乙個排序完畢的大陣列。歸併排序應用的是遞迴的方式。
function mergesort (array)
var mergesortrec = function(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)else}}
while(il < left.length)
while(ir < right.length)
return result;
}
可以看到,演算法首先將原始陣列分割直至只有乙個元素的子陣列,然後開始歸併。
第五種排序演算法是快速排序,也是最常用的排序演算法了。同樣也是用了分治演算法。
「快速排序」的思想很簡單,整個排序過程只需要三步:
(1)在資料集之中,選擇乙個元素作為」基準」(pivot)。
(2)所有小於」基準」的元素,都移到」基準」的左邊;所有大於」基準」的元素,都移到」基準」的右邊。
(3)對」基準」左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下乙個元素為止。
function
quicksort
(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++)
else
}return quicksort(left).concat([pivot], quicksort(right));
}
封裝後的源** 簡單的說一說mmap
mmap memory map,就是記憶體對映 簡單的說就是將檔案對映到使用者的位址空間中。這麼做有什麼好處呢?1.傳統檔案訪問方式是,首先用open系統呼叫開啟檔案,然後使用read,write等呼叫進行順序或者隨即的i o.這種方式是非常低效的,每一次i o操作都需要一次系統呼叫.而通過mmap...
說一說 r與 n
今天在用python讀取txt檔案的時候,遇到了乙個比較坑的問題,那就是 n 和 r 究竟有什麼區別?在計算機還沒有出現之前,人們設計了一種機器叫做電傳打字機,這種機器每秒鐘可以打10個字元。不過它有個問題,就是打完一行換行的時候,需要0.2s,正好可以列印兩個字元,如果這個時候有新的字元傳過來,那...
說一說JS的IIFE
iife immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。對比一下,這是不採用iife時的函式宣告和函式呼叫 function foo foo 下面是iife形式的函式呼叫 functionfoo 函...