您的位置:首页 > 其它

我自己想出来的一个排序算法不同与冒泡快速排序等其他算法

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)次可以排序好,上面消耗时间是纳秒级的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐