數(shù)組的排序算法
關(guān)于排序算法請看這篇文章。
本文嘗試使用js來實(shí)現(xiàn)一部分簡單的算法。
選擇排序
思路:若要從小到大排序,指定索引為1的數(shù)值束凑,與其后面的數(shù)值一一比較,將較小的數(shù)值置于該位置栅盲,再次指定索引為2的數(shù)值,與其后面的數(shù)值比較废恋,同樣將較小數(shù)組置于該位置谈秫,然后依次指定之后的索引位置,執(zhí)行同樣的操作鱼鼓,直到最后遍歷結(jié)束拟烫。
function selectSort(arr){ for(var i = 0;i<arr.length;i++){ for(var j = i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = arr[i] } } } return arr; }
冒泡排序
思路:遍歷數(shù)組,通過比較兩個數(shù)大小互換位置迄本,將最大的數(shù)排列到數(shù)組的末尾硕淑,再次遍歷將第二大數(shù)排列到數(shù)組的倒數(shù)第二位,依次遍歷直到最后
function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i;j++){ if(arr[j] > arr[j+1]){ var temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }
快速排序
實(shí)現(xiàn)思路:取數(shù)組中間數(shù)為基準(zhǔn)嘉赎,遍歷數(shù)組時(shí)將小于基準(zhǔn)的數(shù)大于基準(zhǔn)的數(shù)分組存放兩個不同的數(shù)組置媳,遞歸,將兩個數(shù)組再次執(zhí)行上面操作直到數(shù)組的長度為1公条,操作完成后由小到大進(jìn)行拼接拇囊。
function fastSort(arr){ if(arr.length <= 1){ return arr; } //新建兩個數(shù)組存放 var fontArr =[], endArr = []; //初始基準(zhǔn)位置 var index = Math.floor(arr.length/2); baseVal = arr.splice(index-1,1); for(var i=0;i<arr.length;i++){ if(arr[i] > baseVal){ endArr.push(arr[i]) }else { fontArr.push(arr[i]) } } return arguments.callee(fontArr).concat(baseVal,arguments.callee(endArr)); }
插入排序
實(shí)現(xiàn)思路:從前向后遍歷數(shù)組,遍歷某個數(shù)值時(shí)靶橱,將其與前一數(shù)值進(jìn)行比較寥袭,若大于前一個數(shù)值路捧,則不做處理,若小于則互換位置后在與前一數(shù)值進(jìn)行比較传黄,直到大于前一數(shù)值或到數(shù)組的開頭杰扫。
function insertSort(arr){ for(var i = 0;i<arr.length;i++){ var temp = arr[i]; var j = i-1; while(temp < arr[j]){ arr[j+1] = arr[j]; j--; if(j == -1){ break; } } arr[j+1] = temp; } return arr; }
以上排序方法經(jīng)測試可用,不保證唯一性膘掰,后續(xù)還會更新其他排序方法涉波。