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

最近在写项目中遇到一个排序的问题,想着想着,想出一种排序,不知道是否有前辈已经有写的,或者有这种排序的算法的,我暂时给它起个名字吧,置换排序(要是没有这种算法的话,我会不会是第一个想出这种算法的,嘻嘻,如果是我孤陋寡闻没拜读过,但已经有这种算法的,也请各位大大指点,勿喷我~一边瑟瑟发抖一边在写着博客的我.....)。

好,言归正传,置换排序我的想法是这样:

假设是从小到大排序(大到小排序反过来即可)遍历要排序的集合,准备一个要置换的集合,

将数字放入要置换的集合中,拿要排序集合的数字和置换集合的数字比较小过它的就插入,都大于那就添加在尾巴,最后把置换集合赋给遍历的集合即完成了排序,这么说可能会有些懵吧,没事,我结合数据照着说,你就会明白了,继续往下看:

//示例集合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)次可以排序好,上面消耗时间是纳秒级的。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值