什么是归并排序算法?
答:归并排序算法就是利用分治思想将数组分成两个小组A,B,再将A,B小组各自分成两个小组,依次类推,直到分出来的小组只有一个数据时,可以认为这个小组已经是有序的了,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数组,再合并数组,就完成了归并排序。
面试题(腾讯):有两个有序数组a,b,现需要将其合并成一个新的有序数组。
答:
import java.util.Arrays;
public class Sort { public static void main(String[] args) { //定义两个有序的数组 int[] a = {2,4,6,8,10}; int[] b = {1,3,5,7,9};
//并归排序 int[] c = bingGui(a,b); //打印并归排序后的数组 System.out.println(Arrays.toString(c)); }
private static int[] bingGui(int[] a, int[] b) { int[] c = new int[a.length+b.length]; int i = 0;//数组a的角标 int j = 0;//数组b的角标 int k = 0;//数组c的角标
while (i < a.length && j < b.length) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; }
while (i < a.length) c[k++] = a[i++];
while (j < b.length) c[k++] = b[j++];
return c; } } |
用归并排序算法对任意数组进行排序:
package 归并排序;
import java.util.Arrays;
public class Mian { public static void main(String[] args) { //定义一个数组 int[] arr = {23,4,5,6,2,75,87,98,65,43,432};
//调用方法,归并排序 guiBingSort(arr);
//打印结果 System.out.println(Arrays.toString(arr)); }
private static void guiBingSort(int[] arr) { if(arr.length<=1){ return; } guiBingSort(arr,0,arr.length-1); }
private static void guiBingSort(int[] arr, int low, int high) { if(low>=high){ return; } int mid = (low+high)/2; guiBingSort(arr,low,mid); guiBingSort(arr,mid+1,high); merge(arr,low,mid,high); }
private static void merge(int[] arr, int low, int mid, int high) { int[] a = Arrays.copyOfRange(arr, low, mid+1); int[] b = Arrays.copyOfRange(arr, mid+1, high+1); int[] c = new int[a.length+b.length];
int i = 0; int j = 0; int k = 0; while(i<a.length&&j<b.length){ if(a[i]<b[j]){ c[k++] = a[i++]; }else{ c[k++] = b[j++]; } }
while(i<a.length){ c[k++] = a[i++]; }
while(j<b.length){ c[k++] = b[j++]; }
for(int x=0;x<c.length;x++){ arr[low++] = c[x]; } } } |