算法基礎之完全理解希爾排序

背景

希爾排序,作爲八大排序算法之一,也是面試常考的算法。 它屬於插入排序中的一種,總的看來,主要是通過縮小增量因子來實現對數組進行分組插入排序。這樣看來,就很簡單了。 如果我們將簡單插入排序算法看作是增量爲1的希爾排序,那麼增量爲n的希爾排序也就不難理解了。

簡單插入排序(最簡版的希爾排序)
  function insertSort(arr){
  	for(let i=1; i < arr.length; ++i){
  		// 從後向前比較
  		let tmp = arr[i];
  		let j = 0;
  		for(j=i;j > 0 && arr[j-1] > arr[j];--j){
  			arr[j] = arr[j-1];
  		}
  		arr[j] = tmp;
  	}
  	return arr;
  }
複雜希爾排序

通過上面的簡單插入排序,我們可以發現縮量因子爲1,那麼如果說複雜希爾排序是縮量因子爲gap的插入排序,那麼代碼可以是這樣:

  function shellSort(arr){
  	// 確定縮量因子,進行分組
  	let gap = 1;
  	while(gap < arr.length / 3){
  		gap = gap * 3 + 1;
  	}
  	for(;gap > 0; gap = Math.floor(gap / 3)){
  		// 引入上面的簡單插入排序即可, 用gap去替換1,即可得
  		for(let i=gap; i < arr.length; i++){
	  		// 從後向前比較
	  		let tmp = arr[i];
	  		let j = 0;
	  		for(j=i;j > 0 && arr[j-gap] > arr[j];j -= gap){
	  			arr[j] = arr[j-gap];
	  		}
	  		arr[j] = tmp;
  	   }
  	}
  	return arr;
  }

怎麼樣,是不是非常簡單呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章