归并排序
归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为 2-路归并。
算法描述
- 把长度为 n 的输入序列分成两个长度为 n/2 的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
动图演示
04.gif实例
- 代码实现
public class MergeTest {
public static void main(String[] args) {
int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
System.out.println("排序前:");
printArray(sort);
int[] tmp = new int[sort.length];
mergeSort(sort,0,sort.length-1,tmp);
System.out.println("\n排序后:");
printArray(sort);
}
public static void printArray(int[] array) {
System.out.print("{");
int len=array.length;
for (int i = 0; i < len; i++) {
System.out.print(array[i]);
if (i < len - 1) {
System.out.print(", ");
}
}
System.out.println("}");
}
public static void mergeSort(int[] data,int first,int last,int[] tmp){
if(first<last){
int mid = (last-first)/2+first;
//使左侧有序
mergeSort(data,first,mid,tmp);
//使右侧有序
mergeSort(data,mid+1,last,tmp);
//合并两个有序的子序列
mergeTwo(data, first, mid, last, tmp);
}
}
public static void mergeTwo(int[] data,int first,int mid,int last,int[] tmp) {
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while(i <= m && j <= n){
if(data[i]<data[j]){
tmp[k++] =data[i++];
}else{
//如果B序列值小,就将其移值tmp中
//并且B下标i+1;tmp下标k+1
tmp[k++] = data[j++];
}
}
while(i<=m){
tmp[k++] =data[i++];
}
while(j<=n){
tmp[k++] = data[j++];
}
for (i = 0; i < k; i++) {
data[first + i] = tmp[i];
}
}
}
-
输出结果
02.png
网友评论