排序算法(五):JAVA实现归并排序
2017-07-27 14:28
411 查看
归并排序是采用分治法(Divide and Conquer)的一个典型应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
基本思路:
先递归的把数组划分为两个子数组,一直递归到数组中只有一个元素,然后再调用函数把两个子数组排好序,因为该函数在递归划分数组时会被压入栈,所以这个函数真正的作用是对两个有序的子数组进行排序;
图片来源:http://www.cnblogs.com/chengxiao/p/6194356.html
运行结果如下:
可见,merge函数会
先对{12,10}{32,21}两个子数组排序,排序后成为{12,10}{21,32}(0–1,2–3);
对{12,10,21,36}进行排序,为{10,12,21,36}(0–1–2–3);
对{87,15}排序,排序后为{15,87}(4–5);
对{15,87,46}排序,排序之后为{15,46,87}(4–5–6);
把{10,12,21,36}和{15,46,87}合并为{10,12,15,21,32,46,87}
基本思路:
先递归的把数组划分为两个子数组,一直递归到数组中只有一个元素,然后再调用函数把两个子数组排好序,因为该函数在递归划分数组时会被压入栈,所以这个函数真正的作用是对两个有序的子数组进行排序;
图片来源:http://www.cnblogs.com/chengxiao/p/6194356.html
public class MergeSort { public static void main(String[] args) { int[] arr = {12,10,32,21,87,15,46}; sort(arr); for (int i : arr) { System.out.println(i); } } public static void sort(int[] arr){ int[] tmp = new int[arr.length]; devide(arr,0,arr.length-1,tmp); } //对数组进行拆分 private static void devide(int[] arr,int left,int right,int[] tmp){ if(left < right){ int mid = (left +right)/2; devide(arr,left,mid,tmp); devide(arr,mid+1,right,tmp); System.out.println("left="+left+";"+"right="+right); merge(arr,left,mid,right,tmp); } } //对子数组进行排序 private static void merge(int[] arr, int left, int mid, int right, int[] tmp) { int i = left; int j = mid + 1; int index = 0;//临时数组指针 while(i <= mid && j <= right){ if(arr[i] < arr[j]){ tmp[index++] = arr[i++]; }else{ tmp[index++] = arr[j++]; } } while(i <= mid){ tmp[index++] = arr[i++]; } while(j <= right){ tmp[index++] = arr[j++]; } index = 0; //将temp中的元素全部拷贝到原数组中 while(left <= right){ arr[left++] = tmp[index++]; } } }
运行结果如下:
可见,merge函数会
先对{12,10}{32,21}两个子数组排序,排序后成为{12,10}{21,32}(0–1,2–3);
对{12,10,21,36}进行排序,为{10,12,21,36}(0–1–2–3);
对{87,15}排序,排序后为{15,87}(4–5);
对{15,87,46}排序,排序之后为{15,46,87}(4–5–6);
把{10,12,21,36}和{15,46,87}合并为{10,12,15,21,32,46,87}
归并排序是一种稳定且效率高的算法,但是比较占用空间。稳定是由于在merge函数中比较是两两之间比较,没有跳跃比较。其最坏、最好、平均时间复杂度均为nlog2n,空间复杂度为O(n+logn)。
相关文章推荐
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法Java实现(归并排序)
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- Java实现排序算法——归并排序
- 【排序算法】归并排序(java实现)
- 排序算法的java实现-归并排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法总结(二)-------选择,堆,冒泡,快速,归并排序(java实现)
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 【常用排序算法】归并排序(Java实现)
- 算法 排序算法之归并排序 java实现
- 排序算法Java实现——归并排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- Java实现-高效排序算法之归并排序
- JAVA实现排序算法(二):两种归并排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法(二)_希尔排序、快速排序、归并排序的Java实现
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序