我自己想出来的一个排序算法不同与冒泡快速排序等其他算法
2018-01-25 21:03
260 查看
最近在写项目中遇到一个排序的问题,想着想着,想出一种排序,不知道是否有前辈已经有写的,或者有这种排序的算法的,我暂时给它起个名字吧,置换排序(要是没有这种算法的话,我会不会是第一个想出这种算法的,嘻嘻,如果是我孤陋寡闻没拜读过,但已经有这种算法的,也请各位大大指点,勿喷我~一边瑟瑟发抖一边在写着博客的我.....)。
好,言归正传,置换排序我的想法是这样:
假设是从小到大排序(大到小排序反过来即可)遍历要排序的集合,准备一个要置换的集合,
将数字放入要置换的集合中,拿要排序集合的数字和置换集合的数字比较小过它的就插入,都大于那就添加在尾巴,最后把置换集合赋给遍历的集合即完成了排序,这么说可能会有些懵吧,没事,我结合数据照着说,你就会明白了,继续往下看:
//示例集合la{2,23,49,17,33,49,26,30,78,52},lb
int count = 0;
List<Integer> la = new ArrayList<>();
la.add(2);
la.add(23);
la.add(49);
la.add(17);
la.add(33);
la.add(49);
la.add(26);
la.add(30);
la.add(78);
la.add(52);
List<Integer> lb = new ArrayList<>();
//准备开始
long startTime=System.nanoTime();
for(int m=0;m<la.size();m++) {
//第一个值直接给到lb
if(m == 0) {
lb.add(la.get(m));
count++;
}else {
//标记一个开关,如果la的值小于lb就替换它的位置,开关关闭结束本次循环,如果循环完都没找到大于它的就添加到lb尾巴
boolean flag = true;
for(int n=0;n<lb.size();n++) {
if(la.get(m) < lb.get(n)){
lb.add(n,la.get(m));
flag = false;
count++;
break;
}
count++;
}
if(flag) {
lb.add(la.get(m));
}
}
}
//将lb赋给la,或者直接就用lb也是可以的。
la=lb;
System.out.println(la);
long endTime=System.nanoTime();
System.out.println("执行时间:"+(endTime-startTime)+"遍历次数:"+count);
1.结果:
[2, 17, 23, 26, 30, 33, 49, 49, 52, 78]
执行时间:150165遍历次数:41
将集合增加到20条记录时
2.结果:
[2, 12, 17, 20, 23, 26, 29, 30, 33, 38, 43, 49, 49, 52, 57, 63, 66, 72, 78, 99]
执行时间:181307遍历次数:146
可能数据不够大测试结果不够准确,如果有大神觉得有不当的地方或改进的地方可以给我留言。
结论:
以往我在想一个集合如果要遍历它并且排序,那么遍历次数最高次可能是n*(n-1),
而我这里本来以为n次就差不多实现了,太理想化了,实际是
10条数据遍历了41次,20条遍历了146,也就是相当于遍历了n*(n/2)次可以排序好,上面消耗时间是纳秒级的。
好,言归正传,置换排序我的想法是这样:
假设是从小到大排序(大到小排序反过来即可)遍历要排序的集合,准备一个要置换的集合,
将数字放入要置换的集合中,拿要排序集合的数字和置换集合的数字比较小过它的就插入,都大于那就添加在尾巴,最后把置换集合赋给遍历的集合即完成了排序,这么说可能会有些懵吧,没事,我结合数据照着说,你就会明白了,继续往下看:
//示例集合la{2,23,49,17,33,49,26,30,78,52},lb
int count = 0;
List<Integer> la = new ArrayList<>();
la.add(2);
la.add(23);
la.add(49);
la.add(17);
la.add(33);
la.add(49);
la.add(26);
la.add(30);
la.add(78);
la.add(52);
List<Integer> lb = new ArrayList<>();
//准备开始
long startTime=System.nanoTime();
for(int m=0;m<la.size();m++) {
//第一个值直接给到lb
if(m == 0) {
lb.add(la.get(m));
count++;
}else {
//标记一个开关,如果la的值小于lb就替换它的位置,开关关闭结束本次循环,如果循环完都没找到大于它的就添加到lb尾巴
boolean flag = true;
for(int n=0;n<lb.size();n++) {
if(la.get(m) < lb.get(n)){
lb.add(n,la.get(m));
flag = false;
count++;
break;
}
count++;
}
if(flag) {
lb.add(la.get(m));
}
}
}
//将lb赋给la,或者直接就用lb也是可以的。
la=lb;
System.out.println(la);
long endTime=System.nanoTime();
System.out.println("执行时间:"+(endTime-startTime)+"遍历次数:"+count);
1.结果:
[2, 17, 23, 26, 30, 33, 49, 49, 52, 78]
执行时间:150165遍历次数:41
将集合增加到20条记录时
2.结果:
[2, 12, 17, 20, 23, 26, 29, 30, 33, 38, 43, 49, 49, 52, 57, 63, 66, 72, 78, 99]
执行时间:181307遍历次数:146
可能数据不够大测试结果不够准确,如果有大神觉得有不当的地方或改进的地方可以给我留言。
结论:
以往我在想一个集合如果要遍历它并且排序,那么遍历次数最高次可能是n*(n-1),
而我这里本来以为n次就差不多实现了,太理想化了,实际是
10条数据遍历了41次,20条遍历了146,也就是相当于遍历了n*(n/2)次可以排序好,上面消耗时间是纳秒级的。
相关文章推荐
- 有12个球 其中有1个与其他11个质量不同 但不知道是重还是轻 给你一个天平用3次把那个球找出来
- 有12个球,外形相同,其中一个小球的质量与其他11个不同,给一个天平,需要几次把这个小球找出来并且求出这个小球是比其他的轻还是重
- 搜狐面试题:有12个球,外形都一样,其中有一个质量和其他的不一样,给你一架天平,请问最少称几次可以把那个不同的球找出来。
- 数据结构和算法——排序算法(冒泡法 选择法 插入法 快速法)实现
- 冒泡是一个经典算法
- 一个算法题目的两种不同效率级别的算法对比
- 算法 排序算法之交换排序--冒泡排序和快速排序
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构
- Java统计一个句子中不同单词的个数(然而这个句子并没有句号)的3种算法
- 一个数组中只有两个数是不同的,其他数字是成对出现的,下面代码可将该数组中不同的两数字找出并输出
- 排序算法以及其他算法
- 每天学习一算法系列(23)(写一个程序,要求功能,求出用1、2、5这三个数不同个数组合的和为100的组合数)
- 几种常见排序算法的实现(冒泡法,选择法,插入法,快速排序、堆排序)
- 算法系列(四)排序算法中篇--归并排序和快速排序
- 我一个图片怎么都显示不出来,是博客程序原因还是其他?
- 策略设计模式:把可变的行为抽象出来形成一个算法簇
- java_一个基本的冒泡算法
- 【数据结构与算法】排序算法——快速排序
- Interview Q&A - 有十二个乒乓球形状、大小相同,其中只有一个重量与其它十一个不同,现在要求用一部没有砝码的天秤称三次,将那个重量异常的球找出来,并且要得出它比其它十一个球较重还是较轻
- [算法导论][排序算法]快速排序(quick sort)