算法之归并排序法
之前觉得这个很难,后来看了一些博客,理解了之后总算是懂了。算是之前的补充。(并且今天笔试有排序算法,正好做个记录,加深映象)。
归并排序的核心是分而治之,先分开,再两两合并,合并的时候调整顺序。
例如 待排序序列
4 8 5 3 9 6 2 4
第一次分 4 8 5 3 | 9 6 2 4
第二次分 4 8 | 5 3 | 9 6 | 2 4
第三次分 4 |8 | 5 | 3 | 9| 6 | 2 | 4 (此时序列有序)
合并 4 8 | 3 5 | 6 9| 2 4
3 4 5 8 | 2 4 6 9
2 3 4 5 6 8 9
在48与35合并的时候 4 与3 比较,将3放在前面,4和5比较,4放在前面,8和5比较,5,最后是8 ,后面也是一样的,最终有序。
核心代码如下
//合并数
public static void merge(int[] list,int low ,int high){
int[] temp = new int[high-low+1];
int mid = (low+high)/2;
int i=low,j=mid+1,k=0;
//将数按顺序放入temp
while (i<=mid&&j<=high){
if (list[i]<list[j]){
temp[k++] = list[i++];
}
else {
temp[k++] = list[j++];
}
}
//比后面所有数都大的数
while (i<=mid){
temp[k++] = list[i++];
}
//比前面所有数都大的数
while (j<=high){
temp[k++] = list[j++];
}
//放入list中
k=0;
for (i=low;i<=high;i++,k++){
list[i] = temp[k];
}
}
//归并排序
public static void mergeSort(int[] list, int low, int high) {
if (low < high) {
int middle = (low + high) / 2;
mergeSort(list, low, middle);
mergeSort(list, middle + 1, high);
merge(list, low, high);
}
}
代码已经上传至 https://gitee.com/zhoujie1/studyTest.git
顺便作为之前排序算法的补充。
参考博客 https://blog.csdn.net/dainandainan1/article/details/77851400