优化重复Java的快速排序分区

优化重复Java的快速排序分区,java,quicksort,Java,Quicksort,我正在尝试优化我的分区算法,以便更快地对充满重复元素的数组进行排序,因为如果数组都是重复的,那么它将进入一种无限循环。我唯一能想到的就是做 firstunknown++每次任何相邻元素都是重复的,但我不知道在我的代码中在哪里或如何实现它 任何帮助都将不胜感激,谢谢 一种解决方案可能是删除重复项,然后进行快速排序,然后再将其添加回去。重复项的删除和添加可以在线性时间内完成 删除重复项 此方法从给定数组中删除重复项并返回以下内容的映射: 移除的公共静态映射副本(整数[]arr){ Linked

我正在尝试优化我的分区算法,以便更快地对充满重复元素的数组进行排序,因为如果数组都是重复的,那么它将进入一种无限循环。我唯一能想到的就是做 firstunknown++每次任何相邻元素都是重复的,但我不知道在我的代码中在哪里或如何实现它

任何帮助都将不胜感激,谢谢

 

一种解决方案可能是删除重复项,然后进行快速排序,然后再将其添加回去。重复项的删除和添加可以在线性时间内完成

删除重复项

此方法从给定数组中删除重复项并返回以下内容的映射:

移除的公共静态映射副本(整数[]arr){
LinkedList duplicatesRemoved=新建LinkedList();
HashMap计数=新建HashMap();
for(整数n:arr){
如果(计算容器(n)){
counts.put(n,counts.get(n)+1);
}否则{
计数。放置(n,1);
删除重复项。添加(n);
}
}
返回duplicatesRemoved.toArray(新整数[0]);
}
将重复项添加回排序数组中

完成快速排序后,可以将重复项添加回(同样,在线性时间内):

公共静态整数[]扩展(整数[]arr,哈希映射计数){
LinkedList expanded=新建LinkedList();
for(整数n:arr){
整数计数=计数。获取(n);
for(int i=0;i

这将为您节省处理排序中重复项的复杂工作。

一种解决方案可能是删除重复项,然后进行快速排序,然后再将其添加回。重复项的删除和添加可以在线性时间内完成

删除重复项

此方法从给定数组中删除重复项并返回以下内容的映射:

移除的公共静态映射副本(整数[]arr){
LinkedList duplicatesRemoved=新建LinkedList();
HashMap计数=新建HashMap();
for(整数n:arr){
如果(计算容器(n)){
counts.put(n,counts.get(n)+1);
}否则{
计数。放置(n,1);
删除重复项。添加(n);
}
}
返回duplicatesRemoved.toArray(新整数[0]);
}
将重复项添加回排序数组中

完成快速排序后,可以将重复项添加回(同样,在线性时间内):

公共静态整数[]扩展(整数[]arr,哈希映射计数){
LinkedList expanded=新建LinkedList();
for(整数n:arr){
整数计数=计数。获取(n);
for(int i=0;i

这将节省处理排序中重复项的复杂工作。

您是否考虑过使用三向分区快速排序?如果有重复项,它工作得更快。

private静态void快速排序(int[]arr,int l,int r){
如果(l>=r){
返回;
}
整数值=arr[l];
int lt=l;
int gt=r;
int i=l+1;
while(i值){
交换(arr、i、gt--);
}
否则{
i++;
}
}
快速排序(arr、l、lt-1);
快速排序(arr、gt+1、r);
}

您是否考虑过使用三向分区快速排序?如果有重复项,它工作得更快。

private静态void快速排序(int[]arr,int l,int r){
如果(l>=r){
返回;
}
整数值=arr[l];
int lt=l;
int gt=r;
int i=l+1;
while(i值){
交换(arr、i、gt--);
}
否则{
i++;
}
}
快速排序(arr、l、lt-1);
快速排序(arr、gt+1、r);
}

如果元素相等,则无需进行内部交换。将交换条件从
更改为
=
。重复元素只是Lomuto分区方案的一个问题。交换相等的元素会浪费时间,但随着重复数的增加,分区接近50%/50%的理想分割。如果元素相等,则无需进行内部交换。将交换条件从
更改为
=
。重复元素只是Lomuto分区方案的一个问题。将浪费时间交换相等的元素,但随着重复数的增加,分区将接近50%/50%的理想分割。
private static void quickSort(int[] arr, int l,int r){
    if(l >= r){
        return;
    }
    int value = arr[l];
    int lt = l;
    int gt = r;
    int i = l+1;
    while(i <= gt){
        if(arr[i] < value){
            swap(arr, i++, lt++);
        }
        else if(arr[i] > value){
            swap(arr,i, gt--);
        }
        else{
            i++;
        }
    }
    quickSort(arr, l, lt-1);
    quickSort(arr, gt+1, r);
}