EDIT3:
Используя
StringComparer comparer1 = StringComparer.Ordinal;
вместо
IComparable v
IComparable w
comparer1.Compare(v, w)
Решение проблемы времени выполнения.
Я сделал несколько тестов для алгоритмов сортировки (например, Quicksort, Mergesort) в Java и С#.
Я использовал Java 7 и .NET Framework 4.5 для реализации и выполнения моих алгоритмов. Он показал, что все алгоритмы могут обеспечить более эффективное время автономной работы с использованием Java.
Некоторые примеры времени выполнения для Quicksort:
С#
- n = 1000000 4433 мс
- n = 2000000 10047 мс
Java
- n = 1000000 1311 мс
- n = 2000000 3164 мс
Затем я сделал измерения с помощью инструментов профилирования: С# использовал 75% времени выполнения для сравнения строк (например, CompareTo), тогда как Java использовала только 2% времени выполнения для сравнения.
Почему сравнения строк настолько дороги в С#, а не на Java?
EDIT: Я также тестировал функцию сортировки С# Arrays.sort(INPUT), которая могла бы достичь около 3000 мс для n = 1000000, поэтому я не думаю, что этот код является проблемой. Но в любом случае:
Здесь код для Quicksort:
public class Quicksort {
public static void sort(IComparable[] a) {
sort(a, 0, a.Length - 1);
}
private static void sort(IComparable[] a, int lo, int hi) {
if (hi <= lo) return;
int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(IComparable[] a, int lo, int hi) {
int i = lo;
int j = hi + 1;
IComparable v = a[lo];
while (true) {
while (less(a[++i], v))
if (i == hi) break;
while (less(v, a[--j]))
if (j == lo) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
public static IComparable select(IComparable[] a, int k) {
if (k < 0 || k >= a.Length) {
throw new Exception("Selected element out of bounds");
}
Rnd.Shuffle(a);
int lo = 0, hi = a.Length - 1;
while (hi > lo) {
int i = partition(a, lo, hi);
if (i > k) hi = i - 1;
else if (i < k) lo = i + 1;
else return a[i];
}
return a[lo];
}
private static bool less(IComparable v, IComparable w) {
return (v.CompareTo(w) < 0);
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
Быстрое сортирование измеряется следующим образом:
Stopwatch.Restart();
Quicksort.sort(stringArray);
Stopwatch.Stop();
EDIT2: Кто-то хотел увидеть версию Java. Это точно так же, я просто использую Comparable вместо IComparable и Array.length вместо Array.Length