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