所以我在我的大学里有这样的课,我们做各种各样的类,现在我们做递归排序,又名quickSort。哪里好,你们都知道它做什么,将数组分成两部分,依此类推,直到它以1个元素结尾,然后对它们进行排序。为什么quickSort运行速度较慢?
所以我们讨论哪一个会更快,为什么这就是所谓的quicksort,它的结果是quickSort的复杂性是n.log2(n),而例如冒泡排序是n^2。好的,我在c#中编写了bouth代码,并使用c#计算器的秒表来执行bog alogirithyms,在这里我生成了-65000,65000和长度为50 000个元素的数组。
所以冒泡做了排序首次23秒第二时间29(原因它们是随机量。),即使我使阵列与第一元件50K元件N-1。也就是说,它需要对所有东西进行排序,它在27秒内完成(如此接近随机),如果我从我开始创建一个数组,它确实需要17秒对它进行排序。
所以我跑的快速排序,和良好已过5分钟,还是没有结果......如果我有ARRA运行[我] =我;或者n-i;它给了我stackoverflow例外。
qSort更快的唯一的地方是当有一个数组像100或200,他们已经排序(又名数组[i] = i)和更快的像0.1-0.2秒。布尔sort可以排序真正巨大的数组,而qSort给了我stackoverflow。
所以回到复杂度,qSort为5万个元素= 780482 而bblesort = 2 500 000 000 它清晰如明日qSort需要什么?快99.99%。但它不是?为什么我真的好奇这件事,因为我的Lector曾经说过qSort要快得多。但是在所有类型的测试之后,它似乎比bubblesort更快(稍微快一点),而且它只与没有太多元素的数组一起工作(10k随机元素qSort 17秒,而bublesort 7)。
我的电脑是每个2.6 GHz的酷睿i7 4cores,我有16 GB的内存DDR4。
我会很高兴,如果有人清除的东西,因为我的讲师似乎给我的虚假信息。
EDIT bouth代码: 的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的评论中,在(CPU)时间和(RAM)空间中实现一个真正的递归('f(x):= f(x')')代价非常高。随着递归成为语法糖,每个递归也可以在不递归的情况下实现。 – JimmyB
我已经发布了bouth代码,请检查它是否存在qSort错误。 我希望真的是我在代码中做了错误的事情。 – JohnSmithEr