gpt4 book ai didi

java - 如何获得快速排序的分区以产生正确和预期的输出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:21 29 4
gpt4 key购买 nike

这涉及来自 https://stackoverflow.com/help/on-topic 的“软件算法” , 在这种情况下是快速排序算法

这是https://www.hackerrank.com/challenges/quicksort1的一道练习题(非竞赛题)

基本上你应该接受一个列表,比如说

4 5 3 7 2

并围绕第一个元素进行分区,在本例中为 4。预期输出为

3 2 4 5 7

但是我得到的输出是

2 3 4 7 5 

这是我进行分区的代码(基于 https://courses.cs.washington.edu/courses/cse373/13wi/lectures/02-27/20-sorting3-merge-quick.pdf 幻灯片 16 中的学习友好版本)

static void partition(int[] ar) {
int toPartitionAround = ar[0];
swap(ar, 0, ar.length - 1);
int index = partition(ar, 0, ar.length - 2, toPartitionAround);
swap(ar, index, ar.length - 1);
printArray(ar);
}
static int partition(int[] ar, int left, int right, int toAround) {
while(left <= right) {
while(ar[left] < toAround) {
left ++;
}
while(ar[right] > toAround) {
right --;
}
if(left <= right) {
swap(ar, left, right);
left ++;
right --;
}
}
return left;
}

static void swap(int[] arrayNums, int index1, int index2) {
int temp = arrayNums[index1];
arrayNums[index1] = arrayNums[index2];
arrayNums[index2] = temp;
}

我是否可以对此进行修改以匹配预期的输出?从技术上讲,我是否仍然获得可能的正确输出,因为我的输出确实遵循枢轴左侧的属性元素小于枢轴,而枢轴右侧的元素大于枢轴?

我所做的是分配主元,将其移动到数组的后面,然后围绕主元划分数组的其余部分(从索引 0 到长度 - 2)。使用此输入,在遍历数组(3 和 5)时发生一次交换。然后,当我从分区结果中获取索引时,我将主元与该结果交换,这意味着我交换了 4 和 5。

我是否遵循类似的过程来获得预期的输出?我看不出要替换什么。

最佳答案

阅读@greybeard 和@Smac89 的评论后,我意识到我需要一种稳定形式的快速排序,稳定如“保留输入集的原始顺序,其中比较算法不区分两个或多个项目”(https://softwareengineering.stackexchange.com/questions/247440/what-does-it-mean-for-a-sorting-algorithm-to-be-stable )

对我来说,稳定排序对于这次运行并没有真正意义,因为比较算法确实区分了 3 和 2,但是哦,好吧。有人可以澄清一下吗?

我想出的维护相对的解决方案是创建两个 ArrayList,一个用于保存小于或等于主元的值,一个用于保存大于主元的值。这样就保留了相对定位。(2 将在 3 之后,就像在原始列表中一样)。然后,我将两个 ArrayList 中的值连同枢轴一起移回原始枢轴。

如果有人遇到问题,这是我的代码解决方案

 static void partition(int[] ar) {
List<Integer> smallerValues = new ArrayList<Integer>();
List<Integer> biggerValues = new ArrayList<Integer>();
int toPartitionAround = ar[0];
for(int c=1;c<ar.length;c++) {
if(ar[c] <= toPartitionAround) {
smallerValues.add(ar[c]);
} else {
biggerValues.add(ar[c]);
}
}
for(int c=0;c<smallerValues.size();c++) {
ar[c] = smallerValues.get(c);
}
ar[smallerValues.size()] = toPartitionAround;
for(int m=0;m<biggerValues.size();m++) {
ar[m + smallerValues.size() + 1] = biggerValues.get(m);
}
printArray(ar);
}

关于java - 如何获得快速排序的分区以产生正确和预期的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391733/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com