1. 程式人生 > >快速排序與歸併排序------JavaScript實現

快速排序與歸併排序------JavaScript實現

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)。另外,歸併排序中歸併的演算法並不會將相同關鍵字的元素改變相對次序,所以歸併排序是穩定的。