多种排序算法的思路和简单代码的实现(三)

下面是和快速排序,堆排序,相媲美的归并排序,时间复杂度都为O(nLog2n)。

对于归并排序中出现的递归算法,调用的函数顺序以及如何返回,大家可以访问这个网址来详细理解

http://blog.csdn.net/cinderella_hou/article/details/51763681

个人看了,非常受益。。

 1 /*
 2      * 归并排序: 先递归分解数列,再合并数列,就是归并。归并排序是稳定的。
 3      */
 4     public static void mergSort(int[] a) {
 5
 6         int[] mergarray = new int[a.length]; // 新建一个临时数组,来存储排序好的组
 7         mergSort1(a, 0, a.length - 1, mergarray);
 8
 9     }
10
11     // 递归分解数列函数,来完成到每一组只有一个数,就是有序的,然后从后往前进行合并即可。
12     public static void mergSort1(int[] a, int min, int max, int[] b) {
13
14         int mid = (min + max) / 2;
15         if (min < max) {
16             mergSort1(a, min, mid, b); // 左边有序
17             mergSort1(a, mid + 1, max, b); // 右边有序
18             merg(a, min, mid, max, b);
19         }
20     }
21
22     // 有序数列合并,从第一组的第一个开始和另外一组的第一个数进行比较,把小的赋值给临时数组,在对应数列中删除这个数。
23     // 循环进行比较,如果有数列为空,则把另一个数列剩余的数都赋值给临时数组即可。
24     public static void merg(int[] a, int min, int mid, int max, int[] b) {
25
26         int i = min, j = mid + 1, k = min;
27         while (i <= mid && j <= max) {
28             if (a[i] < a[j])
29                 b[k++] = a[i++];
30             else {
31                 b[k++] = a[j++];
32             }
33         }
34         while (i <= mid) {
35             b[k++] = a[i++];
36
37         }
38         while (j <= max) {
39             b[k++] = a[j++];
40         }
41         for (int k2 = min; k2 < k; k2++) {
42             a[k2] = b[k2];
43
44         }
45
46     }
时间: 2024-10-19 15:14:16

多种排序算法的思路和简单代码的实现(三)的相关文章

多种排序算法的思路和简单代码的实现(一)

就自己简单的理解了一些排序算法(JAVA)思路和代码分享给大家:欢迎大家进行交流. 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2 /* 3 * 直接插入排序: 先确定一个有序数组,然后把插入的数与有序数组从最后依次进行比较, 直到插入的数比有序数组的数大,此数换为插入的数字,从此位置以后 4 * 的数依次向后移动一位. 5 */ 6 public static void insert(int[] a) { 7 for (int i = 1; i

多种排序算法的比较

1.冒泡排序和选择排序 为什么把冒泡排序和选择排序放在一块儿呢?因为我发现他们两个有点像. 冒泡排序是不停的把最大的元素换到数组的最右端. 而选择排序是把最小的元素换到最左端. 看到这儿,你是不是觉得冒泡和选择好像没啥区别啊,把最大换成最小就成了一种新的算法?那我也来一个? 其实,无论换最大还是最小,都无关紧要,就算冒泡变成换最小的元素换到数组的最左端,那它也叫冒泡排序的. 冒泡排序的描述:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进

常见排序算法思路和简单代码实现

算法名称 算法思路 简单代码实现                        

排序算法(一)3种简单排序(选择,冒泡,插入)

排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的.本文简单温习下最基础的三类算法:选择,冒泡,插入. 先定义个交换数组元素的函数,供排序时调用 /** * 交换数组元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){ arr[a] = arr[a]

最全排序算法原理解析、java代码实现以及总结归纳

算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序. 详情如下: 算法评估 排序算法的性能依赖于以下三个标准: 稳定性:如果a原本在b前面,而a=b,排序之后a仍然在b的前面,则稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在

常用排序算法简介以及Java实现代码

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的. 冒泡,插入,基数,归并属于稳定排序 选择,快速,希尔,堆

多种排序算法整理

最近面试一直问到排序,老是各种搞混,特地来整理整理 先盗用一张图: 说明: 内部排序基于内存,外部排序是数据量大,而内存与外存的相结合的排序 一.插入排序 关键词:插入,将数字插入到一条已经排好序的有序表中. 1.1直接插入排序 假设要5,4,2,3,1 要升序排列. i=1 5 i=2 5,4    ==>4,5 i=3 4,5,2 ===>2,4,5 i=4 2,4,5,3 ==>2,3,4,5 ... 思想很简单,就是从一个元素开始,一个个元素添加,返回有序列表. 其复杂度为  

常见排序算法的亲手实现(代码与注释)

1 package sort; 2 3 import java.util.ArrayList; 4 import java.util.Random; 5 6 public class Sort 7 { 8 9 public static Random r = new Random(); 10 11 // public static transient ArrayList<String> arr = new 12 // ArrayList<String>();//动态 transie

多种排序算法

插入排序 已经有一个排好的序列,要将新元素放到序列合适的位置. int *InsertSortA(int *R,n) { int i,j; for(j=1;j<n;j++) { i=j-1; tmp=R[j]; while(i>=0&&R[i]<tmp) { R[i+1]=R[i]; i--; } R[i+1]=tmp; } return R: } 上述算法中每次都要判断i是否小于0,可以让数组第一个元素是一个很小的值,使得R[0]<min{Ri},i为1到n,整个