算法入门学习----2.1归并排序
2018-01-29 10:54
288 查看
一、归并排序的原理
对数组采用了“分治思想”
1.1 分:先通过二分法将数组分为一个一个单独的数。
分的算法实现(递归):传入参数为:
数组(arr)、指向数组最左边的指针(left)、指向数组最右边的指针(right)、
空数组(temp)(长度与原数组一样,用在这里是方便将第一步也归入递归步骤)
实现内容:
当传入的right>left,说明数组可以再细分,于是取两者的平均数(mid)。
这时将数组分为两组:一组是left到mid,另一组是mid+1到right,这两组依次调用递归方法,直到right<=left。
1.2 治(思路和分的思路相反):
第一次,每两个数分为一组,并排序好。第二次,将第一步中的每两组和并成为一组,并排序好。
第三次,将第二步中的每两组和并成为一组,并排序好。
...........................
治的算法实现:
传入参数:
原数组(arr)、要合并的两个数组的左指针(left)、要合并的两个数组的右指针(right)、
要合并的两个数组的中指针(mid)、空数组(temp)。
注:上述的两个数组,在分的思路中,本来是属于同一个数组,后面才分开:
所以左指针为第一个数组的最左,mid指针为第一个数组的最右;
右指针为第二个数组的最右,mid+1指针为第二个数组的最左。
实现内容:
先拿第一个数组的第一个数(left)和第二个数组的第一个数(mid+1)比较
如果第一个数组的数大于(小于)第二个数组的数,那么将第二(一)个数组的数放入新数组(temp)的第一位。
接着第二(一)个数组的指针右移一位,再次进行上述比较。
当出现某一个数组比较完的时候,将另一个数组剩下的数全部加到temp中。
最后将比较好的数组传递给原来的数组(arr)
二、归并排序的空间复杂度和时间复杂度
本人不才:直接借鉴一下其他人的解法 :http://blog.csdn.net/yuzhihui_no1/article/details/44223225三、归并排序的代码实现Java
public class GuiBing { public static void main(String[] args){ int[] arr=new int[]{23,5,15,37,59,45,2,156,32,48}; int[] temp = new int[arr.length];//注意:Int[] temp =arr 这样的话,是将temp指向了arr所指向的数组,当temp改变的时候,arr也会改变 sort(arr,0,arr.length-1,temp); show(arr); } public static void show(int[] arr){ //输出函数 for(int a: arr){ System.out.println(a); } } public static void sort(int[] arr,int left,int right,int[] temp){ if(left<right){ int mid=(left+right)/2; sort(arr,left,mid,temp); //分解 sort(arr,mid+1,right,temp); //分解 jiehe(arr,left,mid,right,temp); //合并 } } public static void jiehe(int[] arr,int left,int mid,int right,int[] temp){ //mid作为两边数组的临界标签 int right_left = mid+1; //存储右数组的最左边指针,用于移动 int left_left = left; int i=0; //存储数组的第一位 while(left_left<=mid && right_left<=right){ //两边数组同时遍历,依次将小的数存入temp数组 if(arr[left_left]<arr[right_left]) temp[i++]=arr[left_left++]; else if(arr[left_left]>arr[right_left]) temp[i++]=arr[right_left++]; } while(right_left<=right){ temp[i++]=arr[right_left++]; } while(left_left <=mid){ temp[i++]=arr[left_left++]; } i=0; while(left <= right){ //遍历,将temp改动的数组复制到arr中 arr[left++] = temp[i++]; } } }
四、参考借鉴文章
https://www.cnblogs.com/chengxiao/p/6194356.htmlhttp://blog.csdn.net/yuzhihui_no1/article/details/44223225
相关文章推荐
- 算法入门学习----2.1归并排序
- 算法入门学习----2.1归并排序
- 算法入门学习----2.1归并排序
- 算法入门学习----1.1冒泡排序
- 算法竞赛入门学习
- 算法竞赛入门经典 2.1 for 循环
- 算法(第四版)学习笔记之归并排序的优化
- 一步步学习数据结构和算法之归并排序效率分析及java实现
- (四)算法学习之归并排序
- TensorFlow入门学习(让机器/算法帮助我们作出选择)
- 算法学习-归并排序
- 算法学习(10)-递归 之归并排序
- == 算法学习入门 ==
- 麻省理工学院-2018年最新深度学习算法及其应用入门课程资源分享
- 算法与数据结构学习 08 归并排序
- 算法入门学习----1.1冒泡排序
- 算法入门学习----1.2选择排序
- 算法竞赛入门经典 2.1 for 循环
- java入门学习(3)—循环,选择,基础算法,API概念
- 算法入门学习----1.3插入排序