今日は、この質問を面接官がその場で手書きで手早く整理してもらいました。 : チャットを続けましょう。データ構造とアルゴリズムについて、簡単なソートを書いてもらえますか? (話している間、彼は私の履歴書をひっくり返してペンを渡しました。つまり、履歴書の裏に書くように言われました)
新人の私: どういう意味ですか?ここに書きますか? (履歴書を指しながら)実は、クイックキューは簡単なのですが、手書きで書けない人も多いのではないでしょうか?難しいですか? いくつかの方法でその場で手書きできる人もたくさんいます。面接官: はい
新人の私: いいえ
面接官: はい、今日の面接はこれで終わりです
新人の私: (とても怒っています。これは労使の履歴書です。労使の履歴書にコードを書きますか?) Shadiao
インタビュアー: (振り返り、混乱して)
よく考えたらまだ若かったけど、今はそんなことはないでしょう。とにかく書くだけ、それはただの紙切れです。
私は初心者ですが手書きはできるので、面接前に意図的に「
口述筆記」を準備しただけです。
次に分析分析----クイックソートを行っていきます。
背景クイック ソートは、1962 年に C. A. R. Hoare によって提案されました。その基本的な考え方は、1 回の並べ替えで並べ替え対象のデータを 2 つの独立した部分に分割することです。一方の部分のすべてのデータは、もう一方の部分のすべてのデータよりも小さいため、この方法を使用して、データの 2 つの部分をすばやく分離します。並べ替えでは、並べ替えプロセス全体を [再帰的に ] 実行できるため、データ全体が順序付けされたシーケンスになります。
この概念を理解するのは非常に困難です。
これは次のように理解できます:
クイック ソートはバブル ソートの改良版です。全体のプロセスは、物事をばらばらにしてつなぎ合わせることです。すべての要素は順序付けられた状態に達します。
中心的なアイデア:
まずシーケンスから基本番号として数値を取得し、次にサイズ分割を実行します;
分割プロセス中に、この数値を比較します。大きい数値をすべて右側に配置し、それ以下の数値をすべて左側に配置します。
各間隔に数値が 1 つだけになるまで、左右の間隔に対して 2 番目のステップを繰り返します。 , これで並び替えは完了です。
以下は、写真の形式で段階的に分解したものです。そしてテキスト。
配列 [4,1,6,2,9,3]
を例として取り上げます。
最初のパス:
2. 快速排序法全流程
import java.util.Arrays; public class QuickSortDemo { //四个步骤: //1.比较startIndex和endIndex,更喜欢理解为校验 //2.找出基准 //3.左边部分排序 //4.右边排序 public static void quickSort(int[] arr, int startIndex, int endIndex) { if (startIndex < endIndex) { //找出基准 int partition = partition(arr, startIndex, endIndex); //分成两边递归进行 quickSort(arr, startIndex, partition - 1); quickSort(arr, partition + 1, endIndex); } } //找基准 private static int partition(int[] arr, int startIndex, int endIndex) { int pivot = arr[startIndex]; int left = startIndex; int right = endIndex; //等于就没有必要排序 while (left != right) { while (left < right && arr[right] > pivot) { right--; } while (left < right && arr[left] <= pivot) { left++; } //找到left比基准大,right比基准小,进行交换 if (left < right) { swap(arr, left, right); } } //第一轮完成,让left和right重合的位置和基准交换,返回基准的位置 swap(arr, startIndex, left); return left; } //两数交换 public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] a = {3, 1, 2, 4, 9, 6}; quickSort(a, 0, a.length - 1); //输出结果 System.out.println(Arrays.toString(a)); } }
[1, 2, 3, 4, 6, 9]
快排寫法還有幾種,有興趣的可以自行找一下,另外也可以看看維基百科中,快排是怎麼介紹的。
#時間複雜度:
最壞情況就是每一次取到的元素就是數組中最小/最大的,這種情況其實就是冒泡排序了(每一次都排好一個元素的順序)
這種情況時間複雜度就好計算了,就是冒泡排序的時間複雜度:T[n] = n * (n-1) = n^2 n;
最好情況下是O(nlog2n),推導過程如下:
(遞迴演算法的時間複雜度公式:T[n] = aT[n/b] f(n) )
https://img2018.cnblogs.com/blog/1258817/201903/1258817-20190326191158640-601403776.png
所以#nlogn##所以#nlogn#(所以#nlog2)##n#nlogn#n#n#n#n#2)#n#n#n#n#2)#n#nlogn#(所以#nlogn.
空間複雜度:快速排序使用的空間是O(1)的,也就是個常數級;而真正消耗空間的就是遞歸呼叫了,因為每次遞歸就要保持一些資料:
最優的情況下空間複雜度為:
O(log2n);每次都平分數組的情況最差的情況下空間複雜度為:
O( n );退化為冒泡排序的情況所以
平均空間複雜度為O(log2n)
以上がMeituan インタビュー: 簡単なスケジュールを手書きしてください。ショックを受けました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。