快速排序與歸併排序------JavaScript實現
阿新 • • 發佈:2018-12-10
1.快速排序
演算法步驟:
- 在陣列中找到基準點(flag),其他數與之比較。
- 建立兩個陣列,小於基準點的數儲存在左邊陣列,大於基準點的數儲存在右邊陣列。
- 拼接陣列,然後左邊陣列與右邊陣列繼續執行1、2兩個步驟,直到最後完成陣列排序。(該步驟可以看出演算法存在迭代性質)
function quicksort(arr){ if(arr.length<=1) { return arr ; // 如果陣列長度小於或等於1,則直接返回陣列(也是跳出迴圈的條件) } var num = Math.floor(arr.length/2); // 找到陣列中間的索引,如果是浮點數,則向下取整 var center = arr.splice(num,1); // 找到陣列中間索引的值 var left = []; var right = []; for(var i=0;i<arr.length;i++){ if(arr[i]<center) { left.push(arr[i]); // 基準點左邊的數放到左邊陣列 } else{ right.push(arr[i]);// 基準點右邊的數放到右邊陣列 } } // 利用concat拼接陣列(注意不要遺漏中間值),並呼叫quickSort方法,利用遞迴的方法 return quicksort(left).concat([center],quicksort(right)); } consloe.log(quicksort([2,4654,798,313,453,15,16,43]));//對一堆數進行排序
將一個數組不斷分成較大較小的兩部分,直至不能分時,陣列就排序完畢,這是快速排序的核心思想。
2.二路歸併排序
- 先將陣列C劃分為兩個陣列A和B(即把陣列C從中間分開)
- 再分別對陣列A、B重複步驟1的操作,逐步劃分,直到不能再劃分為止(每個子陣列只剩下一個元素),這樣,劃分的過程就結束了。
- 然後從下層往上層不斷合併陣列,每一層合併相鄰的兩個子陣列,合併的過程是每次從待合併的兩個子陣列中選取一個最小的元素,然後把這個元素放到合併後的陣列中,不斷重複直到把兩個子陣列的元素都放到合併後的陣列為止。
依次類推,直到合併到最上層結束,這時資料的排序已經完成了。
function merge(left, right) { var result = []; while((left.length > 0) && (right.length > 0)) { if(left[0] < right[0]) //將陣列元素比較並進行排序 { result.push(left.shift()); } else { result.push(right.shift()); } } //當左右陣列長度不等.將比較完後剩下的陣列項鍊接起來即可 return result.concat(left).concat(right); } function mergeSort(arr){ if(arr.length==1) { return arr; } var mid=Math.floor(arr.length/2);//將陣列分成左右兩部分,向下取整 var left_arr=arr.slice(0,mid); var right_arr=arr.slice(mid); return merge(mergeSort(left_arr),mergeSort(right_arr)); } var arr=[12,20,30,21,15,33,26,19,40,25];//對陣列元素進行排序 console.log(mergeSort(arr));
演算法分析 每一趟歸併的時間複雜度為O(n),共需要進行⌈log2n⌉趟。對應的演算法的時間複雜度為O(nlog2n)。歸併排序的空間複雜度O(n)。另外,歸併排序中歸併的演算法並不會將相同關鍵字的元素改變相對次序,所以歸併排序是穩定的。