基本
代码:
public static void gbpx(ArrayList<Integer> data,ArrayList<Integer> temp,int left,int right){
//复制一个初始值为null,长度跟data相同的list用于过度排序
if(temp.size() == 0){
for (int i = 0; i < data.size(); i++) {
temp.add(null);
}
}
// 当左右不相等时,即至少有两个数在待排序数组
if(left<right){
//将数据分成两半
int mid = (left+right)/2;
//左递归跟右递归
gbpx(data,temp,left,mid);
gbpx(data,temp,mid+1,right);
//将本次data排序部分复制一份到辅助数组temp相同位置
for(int i = left;i<=right;i++)
temp.set(i,data.get(i));
int index = left;//记录更新位置索引
int l = left;//记录左边数组的索引
int r = mid+1;//记录右边数组的索引
//用temp辅助数组以及两个指针开始排序
for (;l<=mid && r<=right; index++){
if(temp.get(l)<temp.get(r)){
data.set(index,temp.get(l));
l++;
}else {
data.set(index,temp.get(r));
r++;
}
}
//将左边数组或右边数组剩余数据填入
while (l<=mid){
data.set(index,temp.get(l));
l++;
index++;
}
while (r<=right){
data.set(index,temp.get(r));
r++;
index++;
}
}
}