Итак, у меня есть класс в моем университете, где мы делаем все виды, теперь мы делаем рекурсивную сортировку, а также quickSort. Где хорошо, вы все знаете, что он делает, разделите массив на две части и так далее, пока он не закончится с 1 элементом, а затем отсортируйте их.Почему quickSort медленнее, чем bubblesort?
Итак, мы обсуждаем, какой из них будет быстрее, и почему это так называется quicksort, и заканчивается тем, что сложность quickSort равна n.log2 (n), тогда как, например, сортировка пузырьков n^2. Хорошо, поэтому я написал коды bouth в C# и используя секундомер C# i calcualte hte ms для выполнения алоритимов bouth, где я генерирую случайные числа между -65000, 65000 и массивом с длиной 50 000 элементов.
Так что bubblesort сделал сортировку в первый раз 23 секунды второй раз 29 (потому что они являются randoms ..), даже если я делаю массив с 50k элементами с первыми элементами n-i. Ака ему нужно будет все сортировать, он делает это в течение 27 секунд (так близко к случайному), если я создаю массив, начиная с i, ему нужно 17 секунд, чтобы отсортировать его.
Итак, я запустил quickSort, и хорошо прошло 5 минут, и все еще нет результата ... если я запустил его с помощью arra [i] = i; или n-i; это дает исключение stackoverflow.
Единственное место, где qSort быстрее, - это массив с элементами типа 100 или 200, и они уже отсортированы (aka array [i] = i) и быстрее, чем 0,1-0,2 с. Где сортировка buble может сортировать действительно огромные массивы, в то время как qSort дает мне stackoverflow.
Итак, к сложности, qSort для 50 000 элементов = 780482 while bublesort = 2 500 000 000 Его ясный, как яркий день qSort должно быть чем? На 99,99% быстрее. Но это не так? Почему им действительно интересно об этом, так как мой Лектор сказал, что qSort намного быстрее. Но после всего своего теста его, кажется, (немного) быстрее сравнивают с bubblesort и его работают только с массивом с не большим количеством элементов. (10k randoms элементов qSort 17 секунд, в то время как bublesort 7).
Мой компьютер с i7 4cores каждый на 2,6 ГГц, и у меня 16 ГБ оперативной памяти DDR4.
Буду рад, если кто-то очистит все, так как мой лектор, кажется, дает мне ложную информацию.
EDIT коды: обе QSort ..................................
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace QuickSort
{
class QuickSort
{
static public int Partition(int[] numbers, int left, int right)
{
int pivot = numbers[left];
while (true)
{
while (numbers[left] < pivot)
left++;
while (numbers[right] > pivot)
right--;
if (left < right)
{
int temp = numbers[right];
numbers[right] = numbers[left];
numbers[left] = temp;
}
else
{
return right;
}
}
}
static public void SortQuick(int[] arr, int left, int right)
{
// For Recusrion
if (left < right)
{
int pivot = Partition(arr, left, right);
if (pivot > 1)
SortQuick(arr, left, pivot - 1);
if (pivot + 1 < right)
SortQuick(arr, pivot + 1, right);
}
}
static void Main(string[] args)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
Random rnd = new Random();
int max = Convert.ToInt32(Console.ReadLine());
int[] numbers = new int[max];
for (int i = 0; i < max; i++)
{
numbers[i] = rnd.Next(-65000, 65000);
}
// the code that you want to measure comes here
SortQuick(numbers, 0, max - 1);
for (int i = 0; i < max; i++)
Console.WriteLine(numbers[i]);
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine(elapsedMs);
Console.ReadLine();
}
}
}
Bublesort ................................
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace bublesort
{
class Program
{
static void Main(string[] args)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
int n = int.Parse(Console.ReadLine());
int[] arr = new int[n];
Random rnd = new Random();
int temp = 0;
for (int i = 0; i < n; i++)
{
arr[i] = rnd.Next(-65000,65000);
}
for (int write = 0; write < arr.Length; write++)
{
for (int sort = 0; sort < arr.Length - 1; sort++)
{
if (arr[sort] > arr[sort + 1])
{
temp = arr[sort + 1];
arr[sort + 1] = arr[sort];
arr[sort] = temp;
}
}
}
for (int i = 0; i < arr.Length; i++)
Console.WriteLine(arr[i]);
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Console.WriteLine(elapsedMs);
}
}
}
Не видя своего кода, его невозможно сказать, но, скорее всего, ваш quicksort не будет эффективно реализован. http://stackoverflow.com/questions/33452614/quicksort-algorithm-cormen-gives-stackoverflow. –
Добавление к комментарию @BrendanFrick, реализация в верной рекурсии ('f (x): = f (x ')') является довольно дорогостоящей как в (ЦП) времени, так и в пространстве (ОЗУ). Поскольку рекурсия является синтаксическим сахаром, каждая рекурсия также может быть реализована без рекурсии. – JimmyB
Я опубликовал коды, проверяя это, если что-то не так в qSort. Надеюсь, что я сделал что-то не так в коде. – JohnSmithEr