/**
* 当有大量重复出现的数组时候,可以采用三分切向快速排序。过去我们忽略的重复元素的出现,
* 结果实际中应用效果总不是很好,这个问题实际上直接影响性能.所以迪杰斯拉提出的三分快排
* 在这里实现好了, 可参考https://blog.csdn.net/a8336675/article/details/51818743,说的很明白的
*/
public class Solution{
public static void main(String args[]){
int a[]=new int[]{9,3,-1,4,6,5,7,2,1,0,8,8,5};
System.out.print("排序之前:");
show(a);
System.out.print("\n排序之后:");
sort(a);
show(a);
}
//打印数组
public static void show(int a[]){
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
//交换
public static void swap(int a[],int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
//排序
public static void sort(int a[]){
int n=a.length;
sort(a,0,n-1);
}
/**
* 三分切向快速排序的原理:初始i=low,lt=low+1,gt=high相对于pivot而言
* 0...lt 这一段是较小的 lt+1...i-1这一段是相等的 i....gt-1 是未知的 gt....high是较大的
* 我们不断让 i逼近gt 遇到较小的值 则交换到lt这一个位置,i和lt都后移;
* 遇到较大的值 则交换到gt的位置,但是换下来的值不一定符合正确位置,所以i不能改变
* 遇到相同的值 则i++;
* 最后我们再递归调用 low,lt-1和gt+1到high
*
* */
public static void sort(int a[],int low,int high){
if(low>=high) return;
int i=low+1,lt=low,gt=high;
int pivot=a[low];
while(i<=gt){
if(a[i]<pivot)
swap(a,i++,lt++);
else if(i>pivot)
swap(a,i,gt--);
else
i++;
}
sort(a,low,lt-1);
sort(a,gt+1,high);
}
}