js實現排序演算法
阿新 • • 發佈:2018-11-26
1.氣泡排序
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後一個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
程式碼如下:
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var tmp = null; for(var j=0; j<len-1; j++){ //迴圈9次 for(var i=0; i<len-1-j; i++){ //每次比較10-j-1次數 if(arr[i]>arr[i+1]){ tmp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = tmp; } } console.log('第'+(j+1)+'次迴圈',arr);
}
執行結果
2.選擇排序
依次找到剩餘元素最小值,放置排好序的末尾(第一個放在開頭)。程式碼如下:
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var min = null; var tmp = null; //選擇排序 for(var j=0; j<len-1 ; j++){ min = j; for(var i=j+1; i<len ;i++){if(arr[i] < arr[min]){ min = i; } } tmp = arr[j] arr[j] = arr[min]; arr[min] = tmp; console.log('第'+(j+1)+'次迴圈', arr); }
執行結果:
3.插入排序
即構建有序序列,未排序資料依次從已排序資料按從後往前比較,插入到合適的位置。程式碼如下:
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var cur = null; var tmp = null; //插入排序 for(var j=1; j<len ; j++){ //從第二個開始比較 cur = j-1; tmp = arr[j]; //帶插入元素 while (cur >= 0 && arr[cur] > tmp) { arr[cur+1] = arr[cur]; cur--; } arr[cur+1] = tmp; console.log('第'+(j)+'次迴圈', arr); }
執行結果如下:
4.希爾排序
var arr = [5,4,8,1,3,7,0,9,2,6]; function shellSort(arr) { var len = arr.length; var tmp = undefined; var gap = Math.floor(len/2); while(gap >= 1) { for(var i=0; i<len; i++){ for(var j=i; j>=gap; j=j-gap){ if(arr[j] < arr[j-gap]){ tmp = arr[j]; arr[j] = arr[j-gap]; arr[j-gap] = tmp; } } } gap = Math.floor(gap / 2); } console.log(arr); return arr; } shellSort(arr);
執行結果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5.快速排序
從將待排序列找出一個基準值,通過比較大小分為兩個序列,遞迴查詢直到leng的長度小於2. 用遞迴方法,如下
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var qsort = function(arr){ var len = arr.length; if (len < 2) return arr; var basic = arr[0]; //預設第一個為基準數 var left = []; var right = []; for(var j=1; j<len ; j++){ if(arr[j] < basic){ left.push(arr[j]); }else { right.push(arr[j]); } } return qsort(left).concat(basic, qsort(right)) }
執行結果
6.歸併排序
把序列分成兩個長度為n/2的子序列,對這兩個子序列分別歸併排序(迴圈將兩個陣列的第一個值比較,並彈出第一個值, 直到陣列長度都不存在),將兩個排序好的子序列合併成一個最終的排序序列
var arr = [5,4,8,1,3,7,0,9,2,6]; var merge_sort = function(v){ console.log(v); var merge = function(left, right){ var final = []; while(left.length && right.length) { //兩個陣列的第一個值比較,並刪除第一個值 final.push(left[0] <= right[0] ? left.shift() : right.shift()); } console.log(final.concat(left.concat(right))); return final.concat(left.concat(right)); } //將陣列分為2組 var len = v.length; if (len< 2) return v; var mid = len / 2; return merge(merge_sort(v.slice(0, parseInt(mid))), merge_sort(v.slice(parseInt(mid)))); } merge_sort(arr);
執行結果