Naloga 2 WIP
This commit is contained in:
		
							parent
							
								
									bd363ae662
								
							
						
					
					
						commit
						d0243b20ba
					
				
							
								
								
									
										29
									
								
								naloge/naloga2/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								naloge/naloga2/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					### IntelliJ IDEA ###
 | 
				
			||||||
 | 
					out/
 | 
				
			||||||
 | 
					!**/src/main/**/out/
 | 
				
			||||||
 | 
					!**/src/test/**/out/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Eclipse ###
 | 
				
			||||||
 | 
					.apt_generated
 | 
				
			||||||
 | 
					.classpath
 | 
				
			||||||
 | 
					.factorypath
 | 
				
			||||||
 | 
					.project
 | 
				
			||||||
 | 
					.settings
 | 
				
			||||||
 | 
					.springBeans
 | 
				
			||||||
 | 
					.sts4-cache
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
 | 
					!**/src/main/**/bin/
 | 
				
			||||||
 | 
					!**/src/test/**/bin/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### NetBeans ###
 | 
				
			||||||
 | 
					/nbproject/private/
 | 
				
			||||||
 | 
					/nbbuild/
 | 
				
			||||||
 | 
					/dist/
 | 
				
			||||||
 | 
					/nbdist/
 | 
				
			||||||
 | 
					/.nb-gradle/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### VS Code ###
 | 
				
			||||||
 | 
					.vscode/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Mac OS ###
 | 
				
			||||||
 | 
					.DS_Store
 | 
				
			||||||
							
								
								
									
										8
									
								
								naloge/naloga2/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								naloge/naloga2/.idea/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					# Default ignored files
 | 
				
			||||||
 | 
					/shelf/
 | 
				
			||||||
 | 
					/workspace.xml
 | 
				
			||||||
 | 
					# Editor-based HTTP Client requests
 | 
				
			||||||
 | 
					/httpRequests/
 | 
				
			||||||
 | 
					# Datasource local storage ignored files
 | 
				
			||||||
 | 
					/dataSources/
 | 
				
			||||||
 | 
					/dataSources.local.xml
 | 
				
			||||||
							
								
								
									
										12
									
								
								naloge/naloga2/.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								naloge/naloga2/.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					<component name="InspectionProjectProfileManager">
 | 
				
			||||||
 | 
					  <profile version="1.0">
 | 
				
			||||||
 | 
					    <option name="myName" value="Project Default" />
 | 
				
			||||||
 | 
					    <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
 | 
				
			||||||
 | 
					      <option name="ignoredIdentifiers">
 | 
				
			||||||
 | 
					        <list>
 | 
				
			||||||
 | 
					          <option value="tests.smoke.test_absences_sliding.TestAbsencesSliding.*" />
 | 
				
			||||||
 | 
					        </list>
 | 
				
			||||||
 | 
					      </option>
 | 
				
			||||||
 | 
					    </inspection_tool>
 | 
				
			||||||
 | 
					  </profile>
 | 
				
			||||||
 | 
					</component>
 | 
				
			||||||
							
								
								
									
										6
									
								
								naloge/naloga2/.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								naloge/naloga2/.idea/misc.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="homebrew-23" project-jdk-type="JavaSDK">
 | 
				
			||||||
 | 
					    <output url="file://$PROJECT_DIR$/out" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										8
									
								
								naloge/naloga2/.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								naloge/naloga2/.idea/modules.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="ProjectModuleManager">
 | 
				
			||||||
 | 
					    <modules>
 | 
				
			||||||
 | 
					      <module fileurl="file://$PROJECT_DIR$/naloga2.iml" filepath="$PROJECT_DIR$/naloga2.iml" />
 | 
				
			||||||
 | 
					    </modules>
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										6
									
								
								naloge/naloga2/.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								naloge/naloga2/.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="VcsDirectoryMappings">
 | 
				
			||||||
 | 
					    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										11
									
								
								naloge/naloga2/naloga2.iml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								naloge/naloga2/naloga2.iml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<module type="JAVA_MODULE" version="4">
 | 
				
			||||||
 | 
					  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
				
			||||||
 | 
					    <exclude-output />
 | 
				
			||||||
 | 
					    <content url="file://$MODULE_DIR$">
 | 
				
			||||||
 | 
					      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
 | 
				
			||||||
 | 
					    </content>
 | 
				
			||||||
 | 
					    <orderEntry type="inheritedJdk" />
 | 
				
			||||||
 | 
					    <orderEntry type="sourceFolder" forTests="false" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</module>
 | 
				
			||||||
							
								
								
									
										434
									
								
								naloge/naloga2/src/Naloga2.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										434
									
								
								naloge/naloga2/src/Naloga2.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,434 @@
 | 
				
			|||||||
 | 
					import java.util.Scanner;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Naloga2 {
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        Scanner scanner = new Scanner(System.in);
 | 
				
			||||||
 | 
					        String[] settings = scanner.nextLine().split("\\s+");
 | 
				
			||||||
 | 
					        boolean up = settings[2].equals("up");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IntArray array = new IntArray();
 | 
				
			||||||
 | 
					        for (String s : scanner.nextLine().split("\\s+")) {
 | 
				
			||||||
 | 
					            array.append(Integer.parseInt(s));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Sorter sorter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (settings[1]) {
 | 
				
			||||||
 | 
					            case "insert":
 | 
				
			||||||
 | 
					                sorter = new InsertionSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "select":
 | 
				
			||||||
 | 
					                sorter = new SelectionSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "bubble":
 | 
				
			||||||
 | 
					                sorter = new BubbleSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "heap":
 | 
				
			||||||
 | 
					                sorter = new HeapSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "merge":
 | 
				
			||||||
 | 
					                sorter = new MergeSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "quick":
 | 
				
			||||||
 | 
					                sorter = new QuickSorter();
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                System.out.println("Invalid sort type");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (settings[0]) {
 | 
				
			||||||
 | 
					            case "trace":
 | 
				
			||||||
 | 
					                sorter.trace(array, up);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "count":
 | 
				
			||||||
 | 
					                sorter.count(array, up);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class IntArray {
 | 
				
			||||||
 | 
					    private int[] array;
 | 
				
			||||||
 | 
					    private int size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IntArray() {
 | 
				
			||||||
 | 
					        array = new int[64];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void resize() {
 | 
				
			||||||
 | 
					        int[] tmp = new int[array.length * 2];
 | 
				
			||||||
 | 
					        System.arraycopy(array, 0, tmp, 0, array.length);
 | 
				
			||||||
 | 
					        array = tmp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    boolean isFull() {
 | 
				
			||||||
 | 
					        return size == array.length;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    boolean isEmpty() {
 | 
				
			||||||
 | 
					        return size == 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int size() {
 | 
				
			||||||
 | 
					        return size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void append(int element) {
 | 
				
			||||||
 | 
					        if (isFull()) {
 | 
				
			||||||
 | 
					            resize();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        array[size++] = element;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int get(int index) {
 | 
				
			||||||
 | 
					        return array[index];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void set(int index, int element) {
 | 
				
			||||||
 | 
					        array[index] = element;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void swap(int index1, int index2) {
 | 
				
			||||||
 | 
					        int temp = array[index1];
 | 
				
			||||||
 | 
					        array[index1] = array[index2];
 | 
				
			||||||
 | 
					        array[index2] = temp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IntArray slice(int start, int end) {
 | 
				
			||||||
 | 
					        IntArray result = new IntArray();
 | 
				
			||||||
 | 
					        for (int i = start; i < end; i++) {
 | 
				
			||||||
 | 
					            result.append(array[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String toStringSplit(int[] splits) {
 | 
				
			||||||
 | 
					        return toStringSplit(splits, 0, size());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String toStringSplit(int[] splits, int start, int end) {
 | 
				
			||||||
 | 
					        if (isEmpty()) {
 | 
				
			||||||
 | 
					            return "";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        StringBuilder sb = new StringBuilder();
 | 
				
			||||||
 | 
					        for (int split : splits) {
 | 
				
			||||||
 | 
					            if (split == start) {
 | 
				
			||||||
 | 
					                sb.append("| ");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        sb.append(array[start]);
 | 
				
			||||||
 | 
					        for (int i = start + 1; i < end; i++) {
 | 
				
			||||||
 | 
					            for (int split : splits) {
 | 
				
			||||||
 | 
					                if (i == split) {
 | 
				
			||||||
 | 
					                    sb.append(" |");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            sb.append(" ").append(array[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (int split : splits) {
 | 
				
			||||||
 | 
					            if (end == split) {
 | 
				
			||||||
 | 
					                sb.append(" |");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return sb.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        if (isEmpty()) {
 | 
				
			||||||
 | 
					            return "";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        StringBuilder sb = new StringBuilder();
 | 
				
			||||||
 | 
					        sb.append(array[0]);
 | 
				
			||||||
 | 
					        for (int i = 1; i < size; i++) {
 | 
				
			||||||
 | 
					            sb.append(" ").append(array[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return sb.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abstract class Sorter {
 | 
				
			||||||
 | 
					    int moves = 0;
 | 
				
			||||||
 | 
					    int comparisons = 0;
 | 
				
			||||||
 | 
					    StringBuilder trace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        moves = 0;
 | 
				
			||||||
 | 
					        comparisons = 0;
 | 
				
			||||||
 | 
					        trace = new StringBuilder();
 | 
				
			||||||
 | 
					        trace.append(array.toString()).append("\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void trace(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        sort(array, up);
 | 
				
			||||||
 | 
					        System.out.print(trace.toString());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void count(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        StringBuilder sb = new StringBuilder();
 | 
				
			||||||
 | 
					        sort(array, up);
 | 
				
			||||||
 | 
					        sb.append(moves).append(" ").append(comparisons).append(" | ");
 | 
				
			||||||
 | 
					        sort(array, up);
 | 
				
			||||||
 | 
					        sb.append(moves).append(" ").append(comparisons).append(" | ");
 | 
				
			||||||
 | 
					        sort(array, !up);
 | 
				
			||||||
 | 
					        sb.append(moves).append(" ").append(comparisons);
 | 
				
			||||||
 | 
					        System.out.println(sb);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InsertionSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 1; i < array.size(); i++) {
 | 
				
			||||||
 | 
					            moves++;
 | 
				
			||||||
 | 
					            int tmp = array.get(i);
 | 
				
			||||||
 | 
					            int j = i;
 | 
				
			||||||
 | 
					            while (j > 0) {
 | 
				
			||||||
 | 
					                comparisons++;
 | 
				
			||||||
 | 
					                if (!(up ? array.get(j - 1) > tmp : array.get(j - 1) < tmp)) {
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                moves++;
 | 
				
			||||||
 | 
					                array.set(j, array.get(j - 1));
 | 
				
			||||||
 | 
					                j--;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            moves++;
 | 
				
			||||||
 | 
					            array.set(j, tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            trace.append(array.get(0));
 | 
				
			||||||
 | 
					            for (int l = 1; l < array.size(); l++) {
 | 
				
			||||||
 | 
					                trace.append(" ").append(array.get(l));
 | 
				
			||||||
 | 
					                if (l == i) {
 | 
				
			||||||
 | 
					                    trace.append(" |");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            trace.append("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SelectionSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 0; i < array.size() - 1; i++) {
 | 
				
			||||||
 | 
					            int m = i;
 | 
				
			||||||
 | 
					            for (int j = i + 1; j < array.size(); j++) {
 | 
				
			||||||
 | 
					                comparisons++;
 | 
				
			||||||
 | 
					                if (up ? array.get(j) < array.get(m) : array.get(j) > array.get(m)) {
 | 
				
			||||||
 | 
					                    m = j;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            moves += 3;
 | 
				
			||||||
 | 
					            array.swap(i, m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            trace.append(array.get(0));
 | 
				
			||||||
 | 
					            for (int l = 1; l < array.size(); l++) {
 | 
				
			||||||
 | 
					                if (l - 1 == i) {
 | 
				
			||||||
 | 
					                    trace.append(" |");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                trace.append(" ").append(array.get(l));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            trace.append("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BubbleSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 1; i < array.size(); i++) {
 | 
				
			||||||
 | 
					            int swap = array.size() - 1;
 | 
				
			||||||
 | 
					            for (int j = array.size() - 1; j >= i; j--) {
 | 
				
			||||||
 | 
					                comparisons++;
 | 
				
			||||||
 | 
					                if (up ? array.get(j - 1) > array.get(j) : array.get(j - 1) < array.get(j)) {
 | 
				
			||||||
 | 
					                    array.swap(j - 1, j);
 | 
				
			||||||
 | 
					                    swap = j;
 | 
				
			||||||
 | 
					                    moves += 3;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            i = swap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (i == 0) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            trace.append(array.get(0));
 | 
				
			||||||
 | 
					            for (int l = 1; l < array.size(); l++) {
 | 
				
			||||||
 | 
					                if (l == i) {
 | 
				
			||||||
 | 
					                    trace.append(" |");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                trace.append(" ").append(array.get(l));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            trace.append("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class HeapSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = array.size() / 2 - 1; i >= 0; i--) {
 | 
				
			||||||
 | 
					            siftDown(array, array.size(), i, up);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        trace.append(array).append(" |\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = array.size() - 1; i > 0; i--) {
 | 
				
			||||||
 | 
					            array.swap(0, i);
 | 
				
			||||||
 | 
					            moves += 3;
 | 
				
			||||||
 | 
					            siftDown(array, i, 0, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            trace.append(array.get(0));
 | 
				
			||||||
 | 
					            for (int l = 1; l < array.size(); l++) {
 | 
				
			||||||
 | 
					                if (l == i) {
 | 
				
			||||||
 | 
					                    trace.append(" |");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                trace.append(" ").append(array.get(l));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            trace.append("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void siftDown(IntArray array, int n, int i, boolean up) {
 | 
				
			||||||
 | 
					        int extr = i;
 | 
				
			||||||
 | 
					        int left = 2 * i + 1;
 | 
				
			||||||
 | 
					        int right = 2 * i + 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (left < n) {
 | 
				
			||||||
 | 
					            comparisons++;
 | 
				
			||||||
 | 
					            if (up ? array.get(left) > array.get(extr) : array.get(left) < array.get(extr)) {
 | 
				
			||||||
 | 
					                extr = left;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (right < n) {
 | 
				
			||||||
 | 
					            comparisons++;
 | 
				
			||||||
 | 
					            if (up ? array.get(right) > array.get(extr) : array.get(right) < array.get(extr)) {
 | 
				
			||||||
 | 
					                extr = right;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (extr != i) {
 | 
				
			||||||
 | 
					            array.swap(extr, i);
 | 
				
			||||||
 | 
					            moves += 3;
 | 
				
			||||||
 | 
					            siftDown(array, n, extr, up);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MergeSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					        mergeSort(array, up);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IntArray mergeSort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        if (array.size() <= 1) {
 | 
				
			||||||
 | 
					            return array;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int middle = (array.size() - 1) / 2 + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IntArray left = array.slice(0, middle);
 | 
				
			||||||
 | 
					        moves += left.size();
 | 
				
			||||||
 | 
					        IntArray right = array.slice(middle, array.size());
 | 
				
			||||||
 | 
					        moves += right.size();
 | 
				
			||||||
 | 
					        trace.append(left).append(" | ").append(right).append("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        left = mergeSort(left, up);
 | 
				
			||||||
 | 
					        right = mergeSort(right, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IntArray merged = merge(left, right, up);
 | 
				
			||||||
 | 
					        trace.append(merged).append("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return merged;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IntArray merge(IntArray left, IntArray right, boolean up) {
 | 
				
			||||||
 | 
					        IntArray result = new IntArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int i = 0;
 | 
				
			||||||
 | 
					        int j = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (i < left.size() && j < right.size()) {
 | 
				
			||||||
 | 
					            comparisons++;
 | 
				
			||||||
 | 
					            if (up ? left.get(i) <= right.get(j) : left.get(i) >= right.get(j)) {
 | 
				
			||||||
 | 
					                result.append(left.get(i));
 | 
				
			||||||
 | 
					                i++;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                result.append(right.get(j));
 | 
				
			||||||
 | 
					                j++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            moves++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (i < left.size()) {
 | 
				
			||||||
 | 
					            result.append(left.get(i));
 | 
				
			||||||
 | 
					            moves++;
 | 
				
			||||||
 | 
					            i++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (j < right.size()) {
 | 
				
			||||||
 | 
					            result.append(right.get(j));
 | 
				
			||||||
 | 
					            moves++;
 | 
				
			||||||
 | 
					            j++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class QuickSorter extends Sorter {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    void sort(IntArray array, boolean up) {
 | 
				
			||||||
 | 
					        super.sort(array, up);
 | 
				
			||||||
 | 
					        quickSort(array, 0, array.size() - 1, up);
 | 
				
			||||||
 | 
					        trace.append(array).append("\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void quickSort(IntArray array, int left, int right, boolean up) {
 | 
				
			||||||
 | 
					        if (left >= right) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int r = partition(array, left, right, up);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        trace.append(array.toStringSplit(new int[]{r, r + 1}, left, right + 1)).append("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        quickSort(array, left, r - 1, up);
 | 
				
			||||||
 | 
					        quickSort(array, r + 1, right, up);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int partition(IntArray array, int left, int right, boolean up) {
 | 
				
			||||||
 | 
					        int pivot = array.get(left);
 | 
				
			||||||
 | 
					        moves++;
 | 
				
			||||||
 | 
					        int l = left;
 | 
				
			||||||
 | 
					        int r = right + 1;
 | 
				
			||||||
 | 
					        while (true) {
 | 
				
			||||||
 | 
					            do {
 | 
				
			||||||
 | 
					                l++;
 | 
				
			||||||
 | 
					                comparisons++;
 | 
				
			||||||
 | 
					            } while ((up ? array.get(l) < pivot : array.get(l) > pivot) && l < right);
 | 
				
			||||||
 | 
					            do {
 | 
				
			||||||
 | 
					                r--;
 | 
				
			||||||
 | 
					                comparisons++;
 | 
				
			||||||
 | 
					            } while (up ? array.get(r) > pivot : array.get(r) < pivot);
 | 
				
			||||||
 | 
					            if (l >= r) {
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            array.swap(l, r);
 | 
				
			||||||
 | 
					            moves += 3;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        array.swap(left, r);
 | 
				
			||||||
 | 
					        moves += 3;
 | 
				
			||||||
 | 
					        return r;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user