java - QuickSort的修改(分区Hoare),先偶数降序,然后奇数降序

标签 java arrays algorithm sorting quicksort

我有一个大问题要修改 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; 
    } 
} 

最佳答案

你在第一个循环的情况下做了努力,但是:

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

出于第二个原因,定义一个比较函数可能会更好:

    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) < 0)
  • while (cmp(arr[j], pivot) > 0)

关于java - QuickSort的修改(分区Hoare),先偶数降序,然后奇数降序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62151226/

相关文章:

algorithm - graph - 添加新边后更新最小生成树的实现

Java 深度克隆包含 ArrayList 的对象

java - 为什么@Scheduled 注释不适用于@Transaction 注释。 Spring Boot

java - OpenTok Nexmo 出站调用不适用于 SipProperty 安全设置为真

java - Windows 8.1 x64 上 Eclipse windowbuilder pugin 的设计 View 提示 "Unknown GUI toolkit"

algorithm - 如何动态找出浮点错误率?

c - 在 C 中统一随机打乱 2 个数组

java - Android、Mandrill 和 Parse.com : Java ClassCastException: HashMap cannot be cast to a class

java - Android 4.4.4,创建大量字节数组时,垃圾收集器如何处理?

c# - 获取一组矩形的轮廓