Java常用的排序算法三
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常用的排序算法三的更多相关文章
- java SE 常用的排序算法
java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...
- 常用的排序算法介绍和在JAVA的实现(二)
一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- C#中常用的排序算法的时间复杂度和空间复杂度
常用的排序算法的时间复杂度和空间复杂度 常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...
- 数据结构中常用的排序算法 && 时间复杂度 && 空间复杂度
第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- java实现各种排序算法
java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...
- 排序算法三:Shell插入排序
排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...
- 常用的排序算法介绍和在JAVA的实现(一)
一.写随笔的原因:排序比较常用,借此文介绍下排序常用的算法及实现,借此来MARK一下,方便以后的复习.(本人总是忘得比较快) 二.具体的内容: 1.插入排序 插入排序:在前面已经排好序的序列中找到合适 ...
随机推荐
- 深入理解Scala的隐式转换
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- 用css做出来一个三角形
用css做出来一个三角形 <!--不设置宽高 转换行内块 边线设置成宽度--> <div class="triangle"> 三角 ...
- 本机号码认证黑科技:极光(JG)开发者服务推出“极光认证”新产品
近日,中国领先的大数据服务商极光(JG)推出全新产品--极光认证JVerification.极光认证是极光针对APP用户注册登陆,二次安全验证等身份验证场景打造的一款本机号码认证SDK,验证用户提供的 ...
- android Studio 运行不显示avd 无法运行
上图说明: 出现上图页面,有可能是端口被占用了,我出现这种情况是杀死了一个酷狗音乐的进程 干掉以后:
- Spring Boot 入门系列
本系列博文版权 简书 面皮大师 所有,转载请标明原文及出处: http://www.jianshu.com/u/062bd8f1299c 项目地址: https://github.com/daleiw ...
- js及Java中对于两个时间日期的判断脚本
JS脚本: function checkDateIsEdited(createDate) { var compareDate = createDate.replace("-",&q ...
- ubuntu配置实验
实验:ubuntu配置 需求: caterpillar公司管理员小李需要将公司系统由windows全部更换为ubuntu,并制定SOP(操作指导书) 环境:vmware workstation 1 ...
- 【转载】基于Redis实现分布式锁
背景在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等.大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端 ...
- mongodb 两台互为主从
主机A [root@mysql_master zhxf]# cat docker-compose.yml version: '3' services: mongo_rs1: image: mongo: ...
- tp5.0 根据经纬度 获取附近信息
自己备注一下 /* *参数说明: *$lng 经度 *$lat 纬度 *$distance 周边半径 默认是500米(0.5Km) */ public function returnSquarePoi ...