Java 关于排序算法概念的问题

Java 关于排序算法概念的问题,java,sorting,Java,Sorting,我目前正在学习如何用Java编程,所以我要上一堂关于数据结构之类的课。最近,我们讨论了排序算法的概念,从一开始我就对整个概念感到非常困惑 我们最近接到一个关于排序算法的作业,其中一个问题如下: 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 }

我目前正在学习如何用Java编程,所以我要上一堂关于数据结构之类的课。最近,我们讨论了排序算法的概念,从一开始我就对整个概念感到非常困惑

我们最近接到一个关于排序算法的作业,其中一个问题如下:

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
    }
}
最接近的1d对。给定一个N个实数的序列,找出值最接近的一对整数。给出了一个O(nlogn)算法。用英语描述你提出的算法

基本上,我想问的是:有没有人能向我解释一下排序算法的一般概念和它们的整体用途,并带我了解一下如何回答这个问题?你不必给我答案,我只是想获得回答这个问题所需的知识


谢谢。

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

虽然“logn”一词很常见,但并不十分精确,正确地说,它是“ldn”或log2(ld:logumius dualis,或logumus在基数2上)。log通常表示在base10上的log。 在计算机科学中,几乎所有的log(N)都表示log2(N)

因此,排序列表可以加快算法的速度,特别是当您需要多次搜索时

就你而言:
如果序列已排序,则通过查看序列中的上一个和下一个元素来构造候选对之一。

要回答您的问题:

  • 排序算法的目的 使分拣过程在时间和空间上更加高效。假设你有N个数字,蛮力方法是将每个数字与其他N-1个数字进行比较,因此总共需要进行N^2次比较。但是,一个好的排序算法可以帮助您将复杂度降低到N*logN,性能得到提高

  • 关于这个问题的一般看法 首先,您可以尝试对数字数组进行排序。然后在排序后的数组中遍历一次,比较两个连续数字的差值,尝试找到最接近的一对。 这不一定是最好的解决方案,仅供参考

  • 尝试查看插入排序、快速排序、合并排序 它们是经典之作,有助于理解排序算法


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

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

    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
        }
    }
    
    分类的内容如下:

    {1,7,10,32,45,54,87}
    
    通过首先对数据进行排序,找到最接近的两个元素变得容易多了,不用多久就可以看到
    7
    10
    是最接近的两个元素

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

    这将为您提供:

    O(n日志n)+O(n)

    大约是:


    O(n log n)

    如果您有一个未排序的数字列表[-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(logn))。但是请注意,(排序时间)+(增量时间)
    也就是说,n(logn)+(n-1) 罗伯特·塞吉威克:算法(第四版),第2章:排序很好,但这部分令人困惑:“O(n)比O(n logN)更有效”,它的O(n*logN)+O(n)大约是O(n*logN)感谢所有回答的人,你们每个人都为我把它放到不同的角度,我发现我开始真正理解这一点了!TylerAndFriends,你的回答真的很简单,这是我最需要的,所以非常感谢你。谢谢你的帮助。谢谢@AlexWien,我会澄清的。“n!”这个词让人困惑!指n*(n-1)*n*(n-2)*……*2 * 1; (法克托里耶)