我在 Kotlin 中的快速排序功能返回错误的输出

My quick Sort Function in Kotlin give the wrong output back

我试着做了一个链表的快速排序功能,它可以根据给定的变量对对象进行排序。但我有一个问题,即快速排序功能的输出既没有排序也没有改变。相反,它完全不同。

我尝试更改 addfirst 函数,我尝试更改 connect 函数,但它没有任何作用。

例如,这里是我要排序的列表的控制台输出: (翻译:"Sein name ist": "His name his") :

Sein Name ist: Haarald(Alter: 3)
Sein Name ist: Mark(Alter: 2)
Sein Name ist: Guenter(Alter: 1)
Sein Name ist: Kai(Alter: 4)

现在我在快速排序功能中给出列表后的控制台输出:

Sein Name ist: Haarald(Alter: 3)
Sein Name ist: Mark(Alter: 2)
Sein Name ist: Guenter(Alter: 1)
Sein Name ist: Kai(Alter: 4)
Sein Name ist: Haarald(Alter: 3)
Sein Name ist: Guenter(Alter: 1)
Sein Name ist: Mark(Alter: 2)
Sein Name ist: Guenter(Alter: 1)

所以输出大于输入很奇怪

这里是我使用的函数:

快速排序功能:

fun quickSort(comparator: Comparator<T>){
        if (this.size() < 2)return;

        val pivot = this.getFirst().content;     //Vergleichs Element

        val less = Liste<T>();
        val equal= Liste<T>();
        val more = Liste<T>();

        for (element in this){
            val compared = comparator.compare(pivot,element)
            when{
                compared >  0 -> less.addfirst(element);
                compared == 0 -> equal.addfirst(element);
                compared <  0 -> more.addfirst(element);
            }
        }
        less.quickSort(comparator)
        more.quickSort(comparator)

        this.first = conect(this,conect(equal,less)).first
    }

竞争者:

val intComperator = Comparator<Mensch>{o1: Mensch, o2:Mensch -> when{

          o1.alter == o2.alter -> 0
          o1.alter < o2.alter -> -1
          o1.alter > o2.alter -> 1
          else -> 0
          }
           }

辅助功能: fun getFirst():Eintrag{ return 首先?: throw Exception("(getFirst)此列表中没有元素")}

fun conect(mainList:Liste<T>,toAdd:Liste<T>):Liste<T> {
        mainList.getLast().next = toAdd.first;
        return mainList
    }

最后的代码,执行列表:

class Liste<T>:Iterable<T>{
   
    class Eintrag<T>(val content:T, var next:Eintrag<T>?)

    private var first :Eintrag<T>? = null;

这是完整的代码,对不起,我知道它很乱,我需要将代码分成多个文件,还有一些关于格式的问题:https://github.com/TheDarkRiddle/Kotlin-quick-sort

如果您的 class 将实现 Comparable interface docs here and 而不是将其作为单独的值,您可以使用像这样的简单快速排序实现。

fun <E : Comparable<E>> List<E>.quickSort(): List<E> =
    when {
        size < 2 -> this
        else -> {
            val (l, h) = subList(1, size).partition { it < first() }
            l.quickSort() + first() + h.quickSort()
        }
    }

或者,您可以修改它以使用比较器 val,但老实说,我发现这有点难以理解,并且只适用于 Mensch 类型的对象。

fun List<Mensch>.quickSort(comparator: Comparator<Mensch>): List<Mensch> =
    when {
        size < 2 -> this
        else -> {
            val (l, h) = subList(1, size).partition { intComperator.compare(it, first()) == -1 }
            l.quickSort(comparator) + first() + h.quickSort(comparator)
        }
    }

我没有以任何方式在此处包含 Liste class,因为当您调试某些东西时,最好尽可能减少代码(这就是为什么也是关于创建最小可重现示例的建议),然后开始添加到它,然后你可以轻松检测你的比较器是否关闭,或者你的 classes 是否关闭等。