• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie- Bubble, Quick, Insertion- porówanie czasów

Object Storage Arubacloud
0 głosów
135 wizyt
pytanie zadane 2 kwietnia 2020 w Java przez marzena12345 Użytkownik (770 p.)

Witam, porównuję czasy sortowania poszczególnych algorytmów i z tego co się orientuję to QuickSort powinno być najszybsze .. natomiast u mnie najlepiej wypada Insertion Sort. Może mam coś nie tak z algorytmem Quick?

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        Random random = new Random();
        int[] arrayToSort = new int[10000];
        int[] unsortedArray;
        for (int i = 0; i < 10000; i++) {
            arrayToSort[i] = random.nextInt(10000);
            System.out.print(arrayToSort[i] + ", ");
        }
        unsortedArray = arrayToSort;
        System.out.println(" ");
        System.out.println("---------------");
        long timeBeforeBubbleSort = System.nanoTime();
        arrayBubbleSort(arrayToSort);
        long timeAfterBubbleSort = System.nanoTime();
        System.out.println("Bubble sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania bąbelkowego: " + calculateTimeOfSorting(timeBeforeBubbleSort, timeAfterBubbleSort)
        );
        arrayToSort = unsortedArray;
        System.out.println("---------------");
        long timeBeforeInsertionSort = System.nanoTime();
        arrayInsertionSort(arrayToSort);
        long timeAfterInsertionSort = System.nanoTime();
        System.out.println("Insertion sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania przez  wstawianie: " + calculateTimeOfSorting(timeBeforeInsertionSort, timeAfterInsertionSort));
        arrayToSort = unsortedArray;
        System.out.println("---------------");
        long timeBeforeQuickSort = System.nanoTime();
        arrayQuickSort(arrayToSort, 0, arrayToSort.length - 1);
        long timeAfterQuickSort = System.nanoTime();
        System.out.println("Quick sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania szybkiego: " + calculateTimeOfSorting(timeBeforeQuickSort, timeAfterQuickSort));


    }

    public static void arrayBubbleSort(int[] arrayToSort) {
        for (int i = 0; i < arrayToSort.length; i++) {
            for (int j = 0; j < arrayToSort.length - 1; j++) {
                if (arrayToSort[j] > arrayToSort[j + 1]) {
                    int temp = arrayToSort[j];
                    arrayToSort[j] = arrayToSort[j + 1];
                    arrayToSort[j + 1] = temp;
                }
            }
        }
    }

    public static void arrayInsertionSort(int[] arrayToSort) {
        int currentNumber, otherIndex;
        for (int i = 1; i < arrayToSort.length; i++) {
            currentNumber = arrayToSort[i];
            otherIndex = i;
            while (otherIndex > 0 && currentNumber < arrayToSort[otherIndex - 1]) {
                arrayToSort[otherIndex] = arrayToSort[otherIndex - 1];
                otherIndex--;
            }
            arrayToSort[otherIndex] = currentNumber;
        }
    }

    public static void arrayQuickSort(int[] arrayToSort, int left, int right) {
        if (left >= right) {
            return;
        }
        int pivotValue = arrayToSort[right];
        int border = left - 1;
        int i = left;

        while (i < right) {
            if (arrayToSort[i] < pivotValue) {
                border++;
                if (border != i) {
                    int temp = arrayToSort[border];
                    arrayToSort[border] = arrayToSort[i];
                    arrayToSort[i] = temp;
                }
            }
            i++;
        }
        border++;
        if (border != right) {
            int temp = arrayToSort[border];
            arrayToSort[border] = arrayToSort[right];
            arrayToSort[right] = temp;
        }

        arrayQuickSort(arrayToSort, left, border - 1);
        arrayQuickSort(arrayToSort, border + 1, right);
    }

    public static long calculateTimeOfSorting(long timeBefore, long timeAfter) {
        long difference = timeAfter - timeBefore;
        long timeOfSortingToMicroseconds = (long) (difference* 0.001);
        return timeOfSortingToMicroseconds;

    }
}

 

komentarz 2 kwietnia 2020 przez Molester Bywalec (2,920 p.)
Jakby się czepiać czystych formalizmów to nie zawsze tak jest z tą szybkością algorytmów, to zależy od konkretnego przypadku tj. dla odpowiedniego porządku danych wejściowych najgorszy przypadek quicksorta (zlozonosc kwadratowa), może się okazać wolniejszy niż najlepszy przypadek insertsorta (liniowa). I tak dla np małych tablic quicksort jest faktycznie wolniejszy niż insertsort.

1 odpowiedź

0 głosów
odpowiedź 2 kwietnia 2020 przez adrian17 Ekspert (344,860 p.)

Nie wnikałem w szczegóły, ale... na oko wszędzie poza pierwszym razem "sortujesz" już posortowaną tablicę.

Konkretniej:

unsortedArray = arrayToSort;
arrayBubbleSort(arrayToSort);

unsortedArray i arrayToSort to ta sama tablica. unsortedArray też staje się posortowane.

komentarz 2 kwietnia 2020 przez marzena12345 Użytkownik (770 p.)
dzięki, zrobiłam to w inny sposób (przypisanie tablicy arrayToSort do 3 różnych tablic za pomocą pętli) i w ten sposób nie sortuję posortowanych tablic. Przy okazji mój problem z czasem też się rozwiązał, nie do końca rozumiem dlaczego ale działa :)
komentarz 2 kwietnia 2020 przez adrian17 Ekspert (344,860 p.)

przypisanie tablicy arrayToSort do 3 różnych tablic za pomocą pętli

(można było też po prostu skopiować tablice używając .clone())

komentarz 2 kwietnia 2020 przez marzena12345 Użytkownik (770 p.)
nie znałam tej opcji, spróbuję. dzięki

Podobne pytania

0 głosów
2 odpowiedzi 453 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez k171 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 614 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...