排序算法--归并排序(JAVA)
2015-04-24 15:33
239 查看
1.归并排序思想(参考百度百科)
(1)归并排序主要采用了分治法(Divide and Conquer)的思想。是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
(2)速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
2.归并排序详细分析(以递减为例)(参考百度百科)
归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表(定义函数Merge),然后调用 MergeSort 对子表进行归并,使之成为有序表。
例如:设需排序的数组 a={34,23,12,43 , 22 , 11 , 45 , 32,33 , 11}
(1)调用Merge函数,将数组a分为两部分left={34,23,12,43,22},right={11,45,32,33,11};
(2)对步骤(1)中的left和right分别调用Merge函数;
(3)重复步骤(2),直到字符串的长度为1时,返回字符串。例如,left部分一直划分到最后为:left=Merge({34})={34},right=Merge({23})={23};
(4)再调用MergeSort 对子表进行归并。
3.算法性能
(1)时间复杂度:O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
(2)空间复杂度:O(n)
(3)稳定性:稳定的.
(4)归并排序比较占用内存,但却是一种效率高且稳定的算法。
4.算法实现(java)
(1)归并排序主要采用了分治法(Divide and Conquer)的思想。是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
(2)速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
2.归并排序详细分析(以递减为例)(参考百度百科)
归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表(定义函数Merge),然后调用 MergeSort 对子表进行归并,使之成为有序表。
例如:设需排序的数组 a={34,23,12,43 , 22 , 11 , 45 , 32,33 , 11}
(1)调用Merge函数,将数组a分为两部分left={34,23,12,43,22},right={11,45,32,33,11};
(2)对步骤(1)中的left和right分别调用Merge函数;
(3)重复步骤(2),直到字符串的长度为1时,返回字符串。例如,left部分一直划分到最后为:left=Merge({34})={34},right=Merge({23})={23};
(4)再调用MergeSort 对子表进行归并。
3.算法性能
(1)时间复杂度:O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
(2)空间复杂度:O(n)
(3)稳定性:稳定的.
(4)归并排序比较占用内存,但却是一种效率高且稳定的算法。
4.算法实现(java)
public class Solution{ public static void main(String[]args){ int[] a = {34,23,12,43,22,11,45,32,33,11}; a=Merge(a,0,a.length-1); //若不加上“a=”,直接调用Merge函数,会少排序一次~为什么呢?(有时间时查一下) for(int i:a){ System.out.print(i+" "); } System.out.println(); } public static int[] Merge(int[] a,int left,int right){ int alen = right-left; if(left==right) { int[] temp={a[left]}; return temp; } int mid = left+alen/2; int[] leftA = Merge(a,left,mid); //备注:此处是否可以不新建数组,只是标记下标呢(有时间时再想想~) int[] rightA = Merge(a,mid+1,right); return MergeSort(leftA,rightA); } public static int[] MergeSort(int[] left,int[] right){ int alen = left.length; int blen = right.length; int[] newArray = new int[alen+blen]; while(i<alen&&j<blen){ if(left[i]>=right[j]){ newArray[k++] = left[i++]; }else{ newArray[k++] = right[j++]; } } while(i<alen){ newArray[k++] = left[i++]; while(j<blen){ newArray[k++] = right[j++]; } return newArray; } }
相关文章推荐
- Java 排序算法-归并排序
- Java(.NET)经典排序算法之归并排序
- Java排序算法之归并排序
- 排序算法---归并排序 (java)
- 排序算法的java实现-归并排序
- JAVA实现排序算法(二):两种归并排序
- 排序算法(五):JAVA实现归并排序
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- 排序算法总结(二)-------选择,堆,冒泡,快速,归并排序(java实现)
- 排序算法java 二 --基数排序、归并排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 排序算法(Java实现):Shell排序和归并排序
- 排序算法之两路归并排序(Java)
- 排序算法之归并排序(JAVA)
- ?未检查 Java排序算法大整理——归并排序
- 排序算法之归并排序(JAVA)
- 五十道编程小题目 --- 28 八大排序算法 java 之 07归并排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 【排序算法】归并排序(java实现)
- 排序算法之归并排序(JAVA)