【问题标题】:Modification of QuickSort (partition Hoare), first even numbers descending, then odd numbers descendingQuickSort(分区Hoare)的修改,先偶数降序,再奇数降序
【发布时间】:2020-09-20 21:01:00
【问题描述】:

我有一个大问题要修改 Hoare 分区,以便它按降序排序:首先按偶数,然后按奇数。示例:arr[] = {1, 6, 7, 8, 4, 5},输出:arr[] = {8, 6, 4, 7, 5, 1}。

我可以通过将数组分别分成偶数和奇数并分别对这些部分进行排序来做到这一点。但是,任务是重新设计快速排序,这样您就不必划分数组了。

下面我有我的分区,我的方向正确吗?

static int partition(int []arr, int low,  
                                int high) 
{ 
    int pivot = arr[low]; 
    int i = low - 1, j = high + 1; 

    while (true) 
    { 

        do
        { 
            i++; 
        } while ((arr[i] > pivot && ((arr[i]%2==0 && pivot%2==0) || (arr[i]%2!=0 && pivot%2!=0))) || (arr[i]<pivot && arr[i]%2==0 && pivot%2!=0)); 


        do
        { 
            j--; 
        } while (arr[j] < pivot); 

        if (i >= j) 
            return j; 
        int temp = arr[i]; 
        arr[i] = arr[j]; 
        arr[j] = temp; 
    } 
} 

【问题讨论】:

  • 你试图解决什么问题,你在哪里遇到问题?
  • 我只是用错误的方式解决了这个问题。我创建了 2 个额外的表:一个是偶数,另一个是奇数。我分别对它们进行排序并将结果复制到原始数组中。但是,任务是关于修改快速排序,所以我的方式与任务的内容不兼容。不幸的是,我不知道该怎么做。
  • 分享你迄今为止尝试过的代码。
  • 只需要修改排序使用的比较即可。但它不能像a &lt; b 总是意味着“ab 之后排序”那么简单;奇偶校验(奇/偶)也很重要。现在a &lt; b 仅表示“ab 之后排序”,当ab 均为奇数或均为偶数时;但是当一个奇数另一个偶数时,偶数总是排在奇数之后,
  • 好的,我添加了我的代码。

标签: java arrays algorithm sorting quicksort


【解决方案1】:

你在第一个循环的条件下做了一些努力,但是:

  • 不完全正确
  • 它也应该类似地应用于第二个循环条件

由于第二个原因,最好定义一个比较函数:

    private static int cmp(int a, int b) {
        if (a % 2 != b % 2) return a % 2 - b % 2; 
        return b - a;
    }

现在循环条件应该很简单了:

  • while (cmp(arr[i], pivot) &lt; 0)
  • while (cmp(arr[j], pivot) &gt; 0)

【讨论】:

  • 不幸的是,它几乎很好,但我用你写的那些替换了这些 while 循环。但是,现在例如:{1, 2, 3, 4, 5} 打印 {5, 3, 1, 2, 4} 并且应该是:{5, 3, 1, 4, 2}。
  • 我想这意味着你周围的代码不好?看到它在repl.it 上运行
  • 很遗憾,您发送的那个也是错误的。输出应该是:4 2 5 3 1,而不是 4 2 1 3 5。
  • 不知何故我明白奇数应该按升序排列。那么让我解决这个问题。等等……
  • 我现在已经更正了。只需从cmp 函数中删除一行即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多