关于排序算法概念的问题

时间:2014-03-03 20:59:12

标签: java sorting

我目前正在学习如何使用Java进行编程,因此我正在学习数据结构等等。最近,我们一直在讨论排序算法的概念,从一开始我就对整个概念感到非常困惑。

我们最近获得了排序算法的任务,其中一个问题如下:

  

最近的一对。给定N个实数的序列,找到最接近值的整数对。给出O(N log N)算法。用英语描述您提出的算法。

基本上,我想问的是:有人可以向我解释排序算法的总体思路及其整体目的,并指导我如何回答这个问题?你不必给我一个答案,我只是想获得回答这个问题所需的知识。

谢谢。

4 个答案:

答案 0 :(得分:1)

排序的想法是在排序结构(例如数组,列表或平衡树)中,您可以在日志N操作中找到特定元素。 (在数组中使用例如二进制搜索) 如果列表未排序,则平均需要N / 2次操作。

Altough common,术语“log N”,不是很精确,正确地说是“ld N”或log2(ld:logarithmus dualis,或logarithmus on base 2)。 log通常代表登录base10。 在计算机科学中,几乎所有log(N)都意味着log2(N)

因此,排序列表可以加速您的算法,特别是如果您需要搜索多次。

在你的情况下: 如果对序列进行排序,那么通过查看序列中的上一个和下一个元素来构建其中一个候选对。

答案 1 :(得分:0)

回答你的问题:

  1. 排序算法的目的 使分拣过程在时间和空间上更有效。假如你有N个数字,那么蛮力的方法是将每个数字与其他N-1个数字进行比较,因此你必须进行N ^ 2个比较。但是,一个好的排序算法可以帮助您降低N * logN的复杂性,提高性能。

  2. 关于这个问题的一般概念 首先,您可以尝试对数字数组进行排序。然后只遍历排序数组一次并比较两个连续数字的差异,尝试找到最接近的数字。 这不一定是最佳解决方案,仅供您参考。

  3. 尝试查看插入排序,快速排序,合并排序 它们是经典的,有助于理解排序算法。

答案 2 :(得分:0)

问题是找到2个最接近的元素,让我们看一个例子:

此列表中最接近的两个元素是什么?

data = {1,45,32,7,87,54,10};
嗯,看起来很难说。

我们可以做的一件事就是将每个元素与每个其他元素进行比较,如下所示:

for(int a = 0; a < data.length; a++) {
    for(int b = 0; b < data.length; b++) {
       //compare data[a] to data[b], keep track of closest
    }
}

这称为强力方法,结果将是O(n^2)解决方案,这对您的目的来说太慢了。

让我们尝试不同的方法;让我们先尝试排序数组。

data = {1,45,32,7,87,54,10};
sorted = magicalSort(data)  //You will have to implement the sorting

排序的内容如下:

{1,7,10,32,45,54,87}

通过首先对数据进行排序,找到最接近的2个元素变得更加容易,不需要花费很长时间就可以看到710是最接近的两个元素。

此解决方案的成本为: O(n log n)用于排序(请参阅QuicksortMergesort),加上O(n)用于迭代排序列表并搜索最近的两个元素。

这会给你:

O(n log n) + O(n)

大约是:

O(n log n)

答案 3 :(得分:0)

如果你有一个未排序的数字列表[-3,-7,9,6,0]并希望找到两个“最接近”的数字,你需要计算距离:( - 3,-7), (-3,9),( - 3,6),( - 3,0),( - 7,9),( - 7,6), (-7,0),(9,6),(9,0),(6,0)。这是N!当N变大时,这种情况非常巨大。

如果列表已排序,则只需计算(-7,-3),( - 3,0),(0,6),(6,9)或N-1计算。

当然,对列表进行排序会花费一些成本。 MergSort和QuickSort平均都是O(n(log n))。但请注意(排序时间)+(增量时间)&lt; N!

即,n(log n)+(n-1)&lt; N!