算法入门学习----2.1归并排序
2018-01-29 10:54
267 查看
一、归并排序的原理
对数组采用了“分治思想”
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归并排序
- 数据结构入门学习系列-5(链表的基本操作算法)
- 数据结构与算法学习笔记——动态规划的入门与编程实现
- 《算法导论》[第2章] 算法入门-[2.1] 插入排序
- 算法竞赛入门经典 2.1 for 循环
- 算法学习-归并排序和二分查找
- C++ Primer 学习笔记:泛型算法入门 参数绑定bind
- 算法导论 学习笔记 第二章 算法入门
- 数据结构&算法学习笔记: 归并排序
- 170913_算法导论学习(一)_2.1 插入排序
- 算法竞赛入门经典 2.1 for 循环
- 从入门到精通我是这样学习算法的
- (算法竞赛入门)埃及分数问题学习笔记
- 从入门到精通我是这样学习算法的
- Spark MLlib 入门学习笔记 - FPGrowth频繁项集算法
- Andrew Ng机器学习入门学习笔记(五)之调试学习算法
- 算法竞赛入门经典 2.1 for 循环
- 经典算法学习——归并排序