归并排序
来源:互联网 发布:易语言 网页源码 编辑:程序博客网 时间:2024/06/05 22:31
先说说归并的概念:归并就是将两个或多个有序表合并成一个有序表的过程。若将两个有序表合成一个有序表则称为二路归并,同理,有三路归并、四路归并等。二路归并最为简单和常用。
归并排序就是指利用归并操作把一个无序表排序成一个有序表的过程。
利用二路归并操作进行排序称为二路归并排序,具体过程:
- 首先把待排序表中的每一个元素都看做一个有序表,那么n个元素构成n个有序表。
- 接着两两归并一趟归并得到[n/2]个长度为2的有序表(最后一个表长度可能小于2)
- 然后再将有序表进行两两归并,得到[[n/2]/2]个长度为4的有序表(最后一个表长度可能小于4)
- 最后得到一个长度为n的有序表为止
import java.util.Arrays;public class MergeSort { public static void mergeSort(int[] arrays){ sort(arrays, 0, arrays.length - 1); } public static int[] sort(int[] arrays, int left, int right) { int mid = (left + right) / 2;//中间元素下标 if (left < right) { //对左边数组进行递归 sort(arrays, left, mid); //对右边数组进行递归 sort(arrays, mid + 1, right); //左右归并 merge(arrays, left, mid, right); } return arrays; } public static void merge(int[] arrays, int left, int mid, int right) { int[] temp = new int[arrays.length];//临时数组 int i = left;//左数组第一个元素的指下标 int j = mid + 1;//右数组第一个元素的下标 int k = left;//临时数组下标 //把较小的数先移到临时数组中 while (left <= mid && j <= right) { if (arrays[left] < arrays[j]) { temp[k++] = arrays[left++]; } else { temp[k++] = arrays[j++]; } } //把左边剩余的数移入数组 while (left <= mid) { temp[k++] = arrays[left++]; } //把右边边剩余的数移入数组 while (j <= right) { temp[k++] = arrays[j++]; } //将临时数组中的内容拷贝回原数组中 while(i<=right){ arrays[i] = temp[i]; i++; } } public static void main(String[] args) { int[] arrays = {1,3,6,2,8,7,10,4,9,5}; MergeSort.mergeSort(arrays); System.out.println(Arrays.toString(arrays)); } }
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- java设计模式之单例模式
- 简单的多条件分页查询
- numpy基础——matrix.transpose() 和 matrix.getA()
- technology && manager
- android studio library打包jar
- 归并排序
- 如何优化数据库
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- E
- C++输入输出格式的控制
- 我觉得ok#6
- spring笔记6 容器加载过程、bean初始化
- QUI主体、授权文件
- USB port 如何识别不同的Charger类型