假如数组的前一部分和后一部分都已经排好顺序了,例如:1,3,5,8,2,4,6
对这种数组进行归并排序,代码如下:
int[] arr = [1,3,5,8,2,4,6];
//定义一个中间值
int mid = arr.length/2;
int[] temp = new int[arr.length];
//定义三个指针
int i=0;
int j=mid+1;
int k=0;
while(arr[i]<=mid && arr[j] <arr.length ){
if( arr[i] <= arr[j]){
temp[k] =arr[i];
i++;
k++;
}else{
temp[k] =arr[j];
j++;
k++;
}
}
while(i<=mid){
temp[k++] = arr[i++];
}
while(j<arr.length){
temp[k++] = arr[j++];
}
对数组进行归并,总代码如下:
public static void main(String[] args) {
int[] arr = {1,4,3,8,2,6,5};
sort(arr,0,arr.length-1);
print(arr);
check();
}
public static void sort(int[] arr,int left,int right) {
if(left == right) return;
//分成两半
int mid = left + (right-left)/2;
//左边排序
sort(arr,left,mid);
//右边排序
sort(arr,mid+1,right);
merge(arr,left,mid+1,right);
}
static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound) {
if(leftPtr>=rightPtr) {
System.out.println("取不出空数组,左边值大于右边值");
}else {
//归并排序
int mid = rightPtr - 1;
int[] temp = new int[rightBound-leftPtr +1];
int i=leftPtr;
int j=rightPtr;
int k=0;
while(i<=mid&&j<=rightBound) {
if(arr[i]<=arr[j]) {
temp[k++] = arr[i++];
}else {
temp[k++] = arr[j++];
}
}
while(i<=mid) {
temp[k++] = arr[i++];
}
while(j<=rightBound) {
temp[k++] = arr[j++];
}
for(int m=0;m<temp.length;m++) {
arr[leftPtr + m] = temp[m];
}
}
}
static void swap(int[] arr,int i ,int j) {
//换位
int temp = arr[i];
arr[i]= arr[j];
arr[j] = temp;
}
static void print(int[] arr) {
//打印数组
for(int i = 0;i<arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
static int[] generateRandom() {
//产生随机数组
Random r = new Random();
int[] arr = new int[100];
for(int i=0;i<arr.length;i++) {
arr[i] = r.nextInt(100);
}
return arr;
}
static void check() {
//对数器
int[] arr1 = generateRandom();
int[] arr2 =new int[arr1.length];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
Arrays.sort(arr1);
sort(arr2,0,arr2.length-1);
boolean same = true;
for(int i = 0;i<arr1.length;i++) {
if(arr1[i]!=arr2[i]) {
same = false;
}
}
System.out.println(same);
}