归并排序
1)归并排序思想
1)将数组分成两半
2)对左边排序
3)对右边排序
4)两边都排好顺了 对左右两边进行merge
代码步骤1)两个半截数组已经排好序的情况下,把他们合并到一起
第一次比较 1比3小 把1放到下面,i++
第二次比较 4比3大 把3放到下面,j++
int mid=arr.length/2; int temp[] = new int[arr.length]; int i=0; int j=mid+1; int k=0; while (i<=mid&&j<arr.length){ if (arr[i]<arr[j]){ temp[k++]=arr[i++]; }else{ temp[k++]=arr[j++]; } }
最后两个半截数组如果有剩下的,直接copy到下面
while (i<=mid){ temp[k++]=arr[i++]; } while (j<arr.length){ temp[k++] =arr[j++]; }
代码步骤2)因为我们merge的时候 可能merge的是数组的一部分,下面把上面的方法改进
leftPtr左指针指的位置
rightPtr右指针指的位置
leftPtr右边界
static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){ 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++]; } print(temp); }
代码步骤3)使用递归完成归并排序
package com.example.sort; public class MergeSort { public static void main(String[] args) { int[] arr={1,4,100,7,10,2,3,5,8,9}; sort(arr,0,arr.length-1); print(arr); } static void sort(int[] arr,int left,int right){ if (left>=right){ return; } //分成两半 int mid = (left+right)/2; //左边排序 sort(arr,left,mid); //右边排序 sort(arr,mid+1,right);
//左右两边都排好顺序之后进行merge merge(arr,left,mid+1,right); } /*** * 两个半截数组已经排好序的情况下 * 把他们合并到一起 * 指定整个数组不够灵活,增加参数 * @param arr */ static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){ 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++]; } //把temp数组复制到arr数组中; for (int m=0;m<temp.length;m++){ arr[leftPtr+m]=temp[m]; } } private static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }