インタビューの質問---クイックソートのスペースの複雑さは何ですか?時間計算量の最良および最悪のケースは何ですか?また、最適化ソリューションは何ですか?

 

Array.prototype.quickSort = function() {
		const rec =(arr) =>{
			if(arr.length === 1){return arr}
			// 分别存放 前后的数组
		   const left = []
		   const right = []
		   // 设置一个基准
		   const mid = arr[0]
		   //进行分区
		   for(let i =1; i<arr.length; i+=1){
			   if(arr[i] < mid){
				   left.push(arr[i])
			   }else{
				   right.push(arr[i])
			   }
		   }
		   
		   return [...rec(left),mid,...rec(right)] //...用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中
		}
		const res = rec(this)
		res.forEach((n,i)=>{this[i] = n})
	}
	const arr = [ 5,4,3,2,1,6,9,8,7]
	arr.quickSort()
	console.log(arr)

クイックソートのスペースの複雑さは何ですか?

主な理由は、再帰によって引き起こされるスタックスペースの使用です。最良の場合、再帰ツリーの深さはlog2nです。

スペースの複雑さはO(logn)です

最悪の場合

n-1の再帰呼び出しを行う必要があり、そのスペースの複雑さはO(n)です。

平均、

スペースの複雑さもO(logn)です。

時間計算量の最良および最悪のケースは何ですか?また、最適化ソリューションは何ですか?

最適な条件下で

クイックソートアルゴリズムの時間計算量はO(nlogn)です。

最悪の場合

ソートされるシーケンスは正または逆の順序です。各ディビジョンは、前のディビジョンより1つ少ないレコードを持つサブシーケンスのみを取得します。もう一方は空であることに注意してください。再帰ツリーを描画すると、斜めツリーになります。

このとき、n-1回の再帰呼び出しを行う必要があり、i番目の分割ではピボットの位置であるi番目のレコードを見つけるためにn-i個のキーワードの比較が必要になるため、比較の数は次のようになります。

img

最後に、その時間計算量はO(n ^ 2)です。

時間計算量の最適化:3つ取り除く方法を
使用すると、最悪の場合に時間計算量を効果的に減らすことができます。3つの意味は、ピボット値をA [low]、A [(low + high)/ 2]、およびA [high]の中間値に設定することです。

 

 

 

======================== 

わからない答えを正しく整理するだけです

 

 

 

おすすめ

転載: blog.csdn.net/wanghongpu9305/article/details/111824871
おすすめ