Merge Sort :归并排序;用递归的思想,分解成单个元素的排序,在归并

代码:

 import java.util.*;

 public class  MergeSort
{
public static void main(String[] args)
{
System.out.println("Hello World!");
int [] a = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
mergeSort(a,0,14);
//System.out.println(Arrays.toString(a));
} //思路,先将数组分成两部分,这两部分在分别再分,分成单个的为一个partion,
//然后再归并这些partion
public static int[] mergeSort(int [] num , int low, int high)
{
int mid = (low + high)/2; if(low < high)//分解,递归
{
mergeSort(num, low, mid);
mergeSort(num, mid + 1, high);
merge(num, low, mid, high);//归并
System.out.println(low+"::" + high + "::::"+Arrays.toString(num));
} return num;
}
//归并的函数
public static void merge(int [] num, int low, int mid, int high)
{
int [] store = new int [high - low + 1];
int i = low;
int j = mid + 1;
int k = 0; //比较两个partion,生成新的排序好的数组
while(i <= mid && j <= high)
{
if(num[i] > num[j])
{
store[k] = num[j];
k++;
j++;
}
else
{
store[k] = num[i];
k++;
i++;
}
} //插入剩余的元素
while(i <= mid)
{
store[k] = num[i];
k++;
i++;
}
while(j <= high)
{
store[k] = num[j];
k++;
j++;
} //将排序后的代码拷贝到原来的数组,原来的位置
for(int m = 0; m < store.length; m++)
{
num[m + low] = store[m];
}
}
}

运行结果:打印出了每次归并的结果

E:\java\java_test\sortprogram>java MergeSort
Hello World!
0::1::::[3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
2::3::::[3, 44, 5, 38, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
0::3::::[3, 5, 38, 44, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
4::5::::[3, 5, 38, 44, 15, 47, 36, 26, 27, 2, 46, 4, 19, 50, 48]
6::7::::[3, 5, 38, 44, 15, 47, 26, 36, 27, 2, 46, 4, 19, 50, 48]
4::7::::[3, 5, 38, 44, 15, 26, 36, 47, 27, 2, 46, 4, 19, 50, 48]
0::7::::[3, 5, 15, 26, 36, 38, 44, 47, 27, 2, 46, 4, 19, 50, 48]
8::9::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 27, 46, 4, 19, 50, 48]
10::11::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 27, 4, 46, 19, 50, 48]
8::11::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 4, 27, 46, 19, 50, 48]
12::13::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 4, 27, 46, 19, 50, 48]
12::14::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 4, 27, 46, 19, 48, 50]
8::14::::[3, 5, 15, 26, 36, 38, 44, 47, 2, 4, 19, 27, 46, 48, 50]
0::14::::[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50] E:\java\java_test\sortprogram>

Random Quick Sort:随机快速排序/快速随机排序:就是快速排序,只是每次迭代时选择的比较标志随机选择了,

COUNTING SORT:计数排序----计算数组中的每个数出现的次数-----计数数组适用于当前数组密集的情况:

  1.找出要排序数组中的最大值,和最小值,并根据最大值,和最小值创建计数数组

  2.遍历要排序的数组(计数数组中保存的是这个值出现的次数,每个位置对应了一个数,--个人感觉用如i[0]这个位置存储的最小值出现的个数)

  3.然后遍历计数数组,把数据从新写回原来的数组,排序完成

代码:

 import java.util.*;

 public class CountSort{
public static void main(String[] args)
{
System.out.println("Hello world!");
int[] a = new int[]{2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4, 2, 4, 6, 9, 2};
int min = 100, max = 0; //find the largest and the minest
for(int i = 0; i < a.length; i++)
{
if(a[i] > max)
{
max = a[i];
}
if(a[i] < min)
{
min = a[i];
}
} System.out.println(max+"---"+min); //create array depend on the max and min
int[] b = new int[]{0,0,0,0,0,0,0,0,0,0}; //统计数组中每个元素的个数
for(int i = 0; i < a.length; i++)
{
System.out.print(a[i] - min);
b[(a[i]-min)]++;//b数组的下标加min就是对应的值,b中存放的是对应值的数量
}
System.out.println(); //将结果拷贝回原数组 int j = 0;
for(int i = 0; i < b.length; i++)
{
while(b[i] != 0)
{
a[j] = i + min;
b[i]--;
j++;
}
}
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
}
}

运行结果:

PS E:\Java2018\Atom\sort> java CountSort
Hello world!
9---1
12760111628710313581
[1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 6, 7, 7, 8, 8, 9, 9]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

RADIX SORT:好像叫基数排序,就是多位数排序时的算法,多位数的,按数组中位数最多的算,不够的前面补0啊

  1.创建0-9的9个位置来暂存数据,每个位置可能出现存储多个数据,取出数据的时候按先存先出(类似栈)

  2.遍历多位数的最后一位,然后根据数字,对应存放到对应的位置中,遍历完成后,再把0-9这9个空间的数据,按规则写回到原来的数组中

  3,再次遍历多位数的倒数第二位,重复上面的操作,直到遍历完成多位数的第一位

#######拿到多位整数中每个数位对应数字的的想法————网上看到的,感觉很好用

    1,先拿到个位数的值,然后用这个整数除以10使这个多位数减少一位

    2,用拿到个位数的方法,可以拿到十位数的值,然后再把多位数减少一位

    依次类推,可以拿到最高位的值

代码实例:

 import java.util.*;

 public class RadixSort{
public static void main(String[] args)
{
//System.out.println(getRadix(1020,9)); int[] a = {3221, 1, 10, 9680, 577, 9420, 7, 5622, 4793, 2030, 3138, 82, 2599, 743, 4127}; LinkedHashSet[] l = new LinkedHashSet[10];//创建集合来暂存数据0-9
//初始画,这个很类似二维数组啊,感觉
for(int i = 0; i < 10; i++)
{
l[i] = new LinkedHashSet();
} for(int i = 0; i < 4; i++)//由于指定了四位数,就先按四位数来,---实际要按位数最多来设定
{
//System.out.println("d"+i);
for(int j = 0; j < a.length; j++)//遍历数组,根据对应的值放到对应的集合中
{
//System.out.println("c"+j);
int index = getRadix(a[j], i+1);
//System.out.println(index+"++++"+a[j]);
l[index].add(a[j]);
} int tem = 0;
//一次遍历完成后,再把数据按照规则重写写回原数组
for(int k = 0; k < 10; k++)
{
for(Object v : l[k])
{
//System.out.println(tem+"----"+(Integer)v);
a[tem]=(Integer)v;
tem++; }
l[k].clear();//某个集合数据完全拷贝到原数组后,将该集合清空,为了下次循环的存储否则会出错
}
System.out.println(Arrays.toString(a));
} } //方法获取多位数某位的数字,e:多位数 index:第几位的数字(从后往前,从右往左的顺序
public static int getRadix(int e, int index)
{
int result = 0;
for(int i = 0; i < index; i++)
{
result = e % 10;
e = e / 10;
}
return result;
}
}

运行结果://打印出了每次排序的结果

 1 个警告
PS E:\Java2018\Atom\sort> java RadixSort
[10, 9680, 9420, 2030, 3221, 1, 5622, 82, 4793, 743, 577, 7, 4127, 3138, 2599]
[1, 7, 10, 9420, 3221, 5622, 4127, 2030, 3138, 743, 577, 9680, 82, 4793, 2599]
[1, 7, 10, 2030, 82, 4127, 3138, 3221, 9420, 577, 2599, 5622, 9680, 743, 4793]
[1, 7, 10, 82, 577, 743, 2030, 2599, 3138, 3221, 4127, 4793, 5622, 9420, 9680]

Java常用的排序算法三的更多相关文章

  1. java SE 常用的排序算法

    java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...

  2. 常用的排序算法介绍和在JAVA的实现(二)

    一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...

  3. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  4. C#中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  5. 数据结构中常用的排序算法 && 时间复杂度 && 空间复杂度

    第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...

  6. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  7. java实现各种排序算法

    java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...

  8. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  9. 常用的排序算法介绍和在JAVA的实现(一)

    一.写随笔的原因:排序比较常用,借此文介绍下排序常用的算法及实现,借此来MARK一下,方便以后的复习.(本人总是忘得比较快) 二.具体的内容: 1.插入排序 插入排序:在前面已经排好序的序列中找到合适 ...

随机推荐

  1. [UWP]xaml中自定义附加属性使用方法的注意项

    ---恢复内容开始--- 随笔小记,欢迎指正 在UWP平台上做WVVM的时候,想针对ListBox的SelectionChanged事件定义一个自定义的命令,于是使用自定义附加属性的方式.可是最后自定 ...

  2. (转)最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等

    什么是 RegExp? RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配. 通常用于格式验证.正则替换.查找子串等 各种编程语言的正则表达式基本相同 ...

  3. JVM垃圾收集器(1)

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...

  4. 基于GeoServer切片地图服务的发布

    接着上一篇文章,如何将JPG格式的图片转化为带地理坐标的TIFF格式里提及的最近的一个项目,数据源是一张高分辨率的2.5维图片,现在已经成功转化成了带有地理坐标的TIFF格式.下面将介绍借助GeoSe ...

  5. DOS文件操作命令

    内部命令 COPY---文件固执命令 格式:COPY [源盘:][路径]<源文件名> [目标盘][路径]<目标文件名> 拷贝一个或多个文件到指定盘上 1)COPY是文件对文件的 ...

  6. “全栈2019”Java多线程第十三章:线程组ThreadGroup详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. djngo 1.9版本以后 Foreignkey() 字段 第二个参数 on_delete 必不可少, mysql 外键可以为空

    一.外键的删除 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 """ ...

  8. Swift 函数提前返回

    简评:函数提前返回主要的好处是:将每个错误处理进行分离,审查代码时不需要考虑多种复杂异常,我们可以吧注意力集中在也业务逻辑中,调试代码时可以直接在异常中打断点. 提前返回 首先来看一下需要改进的代码示 ...

  9. QuantLib 金融计算——随机过程之 Heston 过程

    目录 QuantLib 金融计算--随机过程之 Heston 过程 Heston 过程 参考文献 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--随机过程之 H ...

  10. docker 限制 容器内存 使用

    转载 : https://www.cnblogs.com/sparkdev/p/8032330.html 默认情况下容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器 ...