排序算法-归并排序
归并排序
归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
思路
- 拆分
1.利用递归,将大的数据集拆分成小的的数据集。
- 合并
1.申请额外的空间辅助排序
2.创建两个指针,zhi分别指向两个数组的起始位置
3.比较两个指针位置的元素并放入辅助数组中,控制指针后移,比较后若某个数组中还有元素则直接追加拷贝到数组数组中
4.将辅助空间中排好序的元素拷贝回原数组代码实现
public class Merge{ public static void mergeSort(int[] arr){ if(arr == null || arr.length < 2){ return; } mergeSort(arr,0,arr.length - 1); } //递归拆分 public static void mergeSort(int[] arr,int left,int right){ if(left == right){ return; } int mid = mid=(left+right)/2; mergeSort(arr,left,mid); mergeSort(arr,mid + 1,right); merge(arr,left,mid,right); } //合并 public static void merge(int[] arr,int left,int mid, int right){ int[] help = new int[right - left + 1];//申请额外的空间辅助排序 int i = 0; int p1 = left; //两个指针,指向两个待合并数据的其实位置 int p2 = mid + 1; //比较并放入辅助数组 while(p1 <= mid && p2 <= right){ help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } //剩余元素追加进辅助数组 while(p1 <= mid){ help[i++] = arr[p1++]; } while(p2 <= right){ help[i++] = arr[p2++]; } //将辅助数组中排好序的元素拷贝回去 for(int k = 0; k < help.length; k++){ arr[left + k] = help[k]; } } public static void main(String[] args) { int[] arr = new int[]{2,3,6,0,8,7,4,1}; mergeSort(arr); for (int i = 0; i < arr.length ; i++) { System.out.println(arr[i]); } } }