2016-12-09 2 views
0

タイムスタンプ(hh:mm:ss)を古いものから順番にソートする関数を書いた。私はコードの実行時間のおおよその最悪のケースを知ることに興味がありますが、それをどのように判断するのか分かりません。ソートアルゴリズムの実行時間

ネストされたfor loopのため、私のおおよその推測はO(n-1)^2です。私は正しいですか?

もしそうでなければ、誰かが私のコードのおおよその実行時間はBig O表記であると判断できますか?

public void sortTimeStamp(SortTime timestamps[]) 
{ 
    for(int i=0;i<timestamps.length-1;i++) 
    { 
     for(int j=0;j<timestamps.length-1;j++) 
     { 
      if(timestamps[j].hour > timestamps[j+1].hour) 
      { 
       swap_timestamps(timestamps, j); 
      } 
      else 
      if(timestamps[j].hour == timestamps[j+1].hour) 
      { 
       if(timestamps[j].minutes > timestamps[j+1].minutes) 
       { 
        swap_timestamps(timestamps, j); 
       } 
       else 
       if(timestamps[j].minutes == timestamps[j+1].minutes && timestamps[j].seconds > timestamps[j+1].seconds) 
       { 
        swap_timestamps(timestamps, j); 
       } 

      } 
     } 
    } 
} 

スワップ機能

public void swap_timestamps(SortTime timestamps[], int index) 
    { 
     SortTime temp = timestamps[index]; 
     timestamps[index] = timestamps[index+1]; 
     timestamps[index+1] = temp; 
    } 
+0

なぜfor(int i = 0; i <4; i ++) '?これはあなたの配列には常に4つの要素があることを意味しますか? – jsalatas

+0

はい、あなたのループが 'SortTime'オブジェクト/コレクションの全長にわたって反復しようとしていると仮定すると、' O(n^2) 'と思われます。 –

+0

https://rob-bell.net/2009/06/a-beginners-guide-to-bigo-o-notation/ – Chewtoy

答えて

4

私はこのソートアルゴリズムはO(N^2)だと思います。
あなたの答えはO((n-1)^2)であり、それはO(n^2-2n+1)に等しい。
しかし、ビッグO記法O(f(n))が(正確には正しくないが、理解しやすいのです)「時間がf(n)のためにほぼ比例する」という意味
だから-2n1用語を考える必要はありません。
あなたはn^2という用語を考えることができ、係数は必要ありません。

しかし、mergesortを行うことができ、時間の複雑さはO(n log n)です。
hh:mm:ssは86400通りしか表現できないので、ソートはOKです。それは、k = 86400であるO(n + k)を達成する。

+0

ご回答いただきありがとうございます。簡単な説明のため+1。 – Yousaf

+0

ありがとうございます。学習アルゴリズムを楽しむ:-) – square1001

+1

言及する価値は、nが大きいときにO(n)表記法が適用されるということである。 n> Infのとき、O(n^2^n + 1)→O(n^2)。 – patrik