
import matplotlib.pyplot as plt
import pandas as pd
import io

output = """
--- Running Performance Analysis ---                                                                                             
Algorithm      Size      Avg Time (s)        Avg Comparisons          Avg Moves                Correct?                          
--------------------------------------------------------------------------------------------------------------                   
InsertSort     100       0.000006            2628                     2633                     Yes                               
InsertSort     1000      0.000108            251895                   251902                   Yes                               
InsertSort     10000     0.010841            25002574                 25002583                 Yes                               
InsertSort     50000      -> Skipped                                                                                             
InsertSort     100000     -> Skipped                                                                                             
InsertSort     500000     -> Skipped                                                                                             
                                                                                                                                 
BubbleSort     100       0.000018            4891                     7118                     Yes                               
BubbleSort     1000      0.001527            498086                   754888                   Yes                               
BubbleSort     10000     0.147654            49984024                 74752463                 Yes                               
BubbleSort     50000      -> Skipped                                                                                             
BubbleSort     100000     -> Skipped                                                                                             
BubbleSort     500000     -> Skipped                                                                                             
                                                                                                                                 
ShellSort      100       0.000003            859                      911                      Yes                               
ShellSort      1000      0.000040            15404                    15912                    Yes                               
ShellSort      10000     0.000577            263303                   268383                   Yes                               
ShellSort      50000     0.003500            1883075                  1908568                  Yes                               
ShellSort      100000    0.007738            4329053                  4379481                  Yes                               
ShellSort      500000    0.047314            28756169                 29008608                 Yes                               
                                                                                                                                 
MergeSort      100       0.000005            541                      1344                     Yes                               
MergeSort      1000      0.000053            8710                     19952                    Yes                               
MergeSort      10000     0.000639            120467                   267232                   Yes                               
MergeSort      50000     0.003562            718133                   1568928                  Yes                               
MergeSort      100000    0.007466            1536366                  3337856                  Yes                               
MergeSort      500000    0.042618            8837077                  18951424                 Yes                               
                                                                                                                                 
QuickSort      100       0.000002            633                      1146                     Yes                               
QuickSort      1000      0.000027            11070                    18485                    Yes                               
QuickSort      10000     0.000340            156205                   257969                   Yes                               
QuickSort      50000     0.001971            938346                   1488604                  Yes                               
QuickSort      100000    0.004147            2013584                  3293229                  Yes                               
QuickSort      500000    0.023807            11835910                 18761405                 Yes                               
                                                                                                                                 
QuickSortOpt   100       0.000002            723                      1306                     Yes                               
QuickSortOpt   1000      0.000029            10853                    19089                    Yes                               
QuickSortOpt   10000     0.000359            152089                   263599                   Yes                               
QuickSortOpt   50000     0.002079            889846                   1472662                  Yes                               
QuickSortOpt   100000    0.004246            1894396                  3081447                  Yes                               
QuickSortOpt   500000    0.025016            10915240                 17611893                 Yes                               
                                                                                                                                 
QuickSort3Way  100       0.000003            756                      693                      Yes                               
QuickSort3Way  1000      0.000039            12003                    9189                     Yes                               
QuickSort3Way  10000     0.000479            168509                   114458                   Yes                               
QuickSort3Way  50000     0.002715            1013555                  652409                   Yes                               
QuickSort3Way  100000    0.005945            2123298                  1376911                  Yes                               
QuickSort3Way  500000    0.032901            12324462                 7696985                  Yes                               
                                                                                                                                 
DualPivotSort  100       0.000002            624                      884                      Yes                               
DualPivotSort  1000      0.000026            10635                    12297                    Yes                               
DualPivotSort  10000     0.000331            151783                   170443                   Yes                               
DualPivotSort  50000     0.001911            908308                   974849                   Yes                               
DualPivotSort  100000    0.004047            1926590                  2053087                  Yes                               
DualPivotSort  500000    0.022747            11189537                 11712207                 Yes                               
"""

# Use StringIO to treat the string data as a file
data = io.StringIO(output)

# Read the data, skipping the header and footer
df = pd.read_csv(data, sep='\s+', skiprows=3, skipfooter=1, engine='python',
                 names=['Algorithm', 'Size', 'Avg Time (s)', 'Avg Comparisons', 'Avg Moves', 'Correct?'])

# Drop the 'Correct?' column as it's not needed for plotting
df = df.drop(columns=['Correct?'])

# Remove rows with 'Skipped' values
df = df[~df.isin(['->', 'Skipped']).any(axis=1)]

# Convert columns to numeric types
for col in ['Size', 'Avg Time (s)', 'Avg Comparisons', 'Avg Moves']:
    df[col] = pd.to_numeric(df[col])

# Get the list of algorithms
algorithms = df['Algorithm'].unique()

# Plotting
plt.style.use('ggplot')

# --- Plot 1: Average Time vs. Size ---
plt.figure(figsize=(12, 8))
for algo in algorithms:
    subset = df[df['Algorithm'] == algo]
    plt.plot(subset['Size'], subset['Avg Time (s)'], marker='o', linestyle='-', label=algo)

plt.title('Average Time vs. Input Size')
plt.xlabel('Input Size (n)')
plt.ylabel('Average Time (seconds)')
plt.xscale('log')
plt.yscale('log')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.savefig('average_time_vs_size.png')
plt.close()

# --- Plot 2: Average Comparisons vs. Size ---
plt.figure(figsize=(12, 8))
for algo in algorithms:
    subset = df[df['Algorithm'] == algo]
    plt.plot(subset['Size'], subset['Avg Comparisons'], marker='o', linestyle='-', label=algo)

plt.title('Average Comparisons vs. Input Size')
plt.xlabel('Input Size (n)')
plt.ylabel('Average Comparisons')
plt.xscale('log')
plt.yscale('log')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.savefig('average_comparisons_vs_size.png')
plt.close()

# --- Plot 3: Average Moves vs. Size ---
plt.figure(figsize=(12, 8))
for algo in algorithms:
    subset = df[df['Algorithm'] == algo]
    plt.plot(subset['Size'], subset['Avg Moves'], marker='o', linestyle='-', label=algo)

plt.title('Average Moves vs. Input Size')
plt.xlabel('Input Size (n)')
plt.ylabel('Average Moves')
plt.xscale('log')
plt.yscale('log')
plt.legend()
plt.grid(True, which="both", ls="--")
plt.savefig('average_moves_vs_size.png')
plt.close()

print("Plots saved as average_time_vs_size.png, average_comparisons_vs_size.png, and average_moves_vs_size.png")
