关于归并排序的原理这里不再赘述,直接附上代码
Java实现如下:
public class Solution6 {
public static void mergeSort(int[] arr){
int[] tempArr = new int[arr.length];
sort(arr,tempArr,0,arr.length-1);
}
private static void sort(int[] arr,int[] tempArr,int startIndex,int endIndex){
if(endIndex <= startIndex) return;
int middleIndex = startIndex + (endIndex - startIndex) / 2;
//分解
sort(arr, tempArr, startIndex, middleIndex);
sort(arr, tempArr, middleIndex + 1, endIndex);
//归并
merge(arr, tempArr, startIndex, middleIndex, endIndex);
}
private static void merge(int[] arr, int[] temArr, int staIndex, int midIndex, int endIndex){
for(int i = staIndex; i <= endIndex; i++) temArr[i] = arr[i];
int left = staIndex;
int right = midIndex+1;
for(int i=staIndex; i<=endIndex; i++){
if(left > midIndex) arr[i] = temArr[right++];
else if(right > endIndex) arr[i] = temArr[left++];
else if(temArr[right] < temArr[left]) arr[i] = temArr[right++];
else arr[i] = temArr[left++];
}
}
}
时间复杂度: O(nlogn)
空间复杂度: O(1)
补充:
arr[i++]; 先arr[i]再i自增
arr[++i]; 先i自增再arr[i]
要将一个数组排序,可以先将它分成两半分别排序,然后将结果归并起来。这就是归并排序。归并排序的主要优势是它能保证将任意长度为n的数组排序所需时间与nlogn成正比,它的主要缺点则是它所需的额外空间与n成正比。 4.1 自顶而下的归并 该方法先将所有元素复制到aux[]中,然后再归并到a[]中。方法在归并时用到4个条件判断:左半边用尽取右半边的元素,右半边用尽取左半边元素,右半边当前元素小于左半边当前...
归并排序 基本理解 归并排序利用了分治法,将序列分为若干个子序列,两两一组进行排序合并。 大致过程为:将长度为n的序列分成n个组,然后两两进行排序合并,即第1个和第2个比较大小合并成一组,第3个和第4个比较大小合并为一组……这样一趟下来从一开始的n个组变为了n/2组,继续将合并后的第1组和第2组比较大小排序进行合并……第二趟下来变为n/4个组...
归并排序的定义: 是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 归并排序的基本思想: 设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。 1、j=m+1;k=i;i=i; 置两个子表的起始下标及辅助数组的起始...
归并排序是一种很稳定,很快的排序,时间复杂度为O(nlogn),作者很喜欢这个排序 大概思想就是分治,每次找一半,直到就剩一左一右两个元素,比如说{4,8,6,2,3,7} 递归找到最左面的也就是 {4,8}发现有序,然后回溯找右面的发现右面不够两个,再回溯也就是{4,8,6}合并,即{4,8}和{6}合并,取一个temp数组,用来存储合并后有序的这个数组,取左数组和右数组的头,遵循一个思想,谁小...
...
归并排序(Merge sort) 定义 归并排序时建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现有两种方法: 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法) 自下而上的迭代 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。...
【选择排序(Selection Sort)】 选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的元素中选出最小(或最大)的一个元素,与已排序序列的后一个位置进行交换,使得已排序的序列长度+1,重复操作直到没有元素待排序。 排序过程如下: 原序列:6 8 1 4...
...
归并排序 mergeSort,分治策略。reference: http://www.cnblogs.com/chengxiao/p/6194356.html...