【发布时间】:2015-09-13 05:20:42
【问题描述】:
我正在尝试使用冒泡排序和选择排序的各种场景。 我知道如果我们使用 break 语句,冒泡排序的最佳情况是 O(n)。 但是可以说,即使我没有使用任何 break 语句,也不会有任何交换(因为我们有 if 条件),并且它应该花费与选择排序相同或更少的时间。
但奇怪的是它花费了我更多的时间。
注意:我采用了已经排序的相同数据集(1 到 900000)。 由于我使用的是已经排序的数据集,因此没有任何算法会有任何交换。
请在下面找到程序:
package sorting;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Sorting<Item extends Comparable>//this Item is a var/field which can only be find while creatng a object and hence it is non static
{
List<Item> list=new ArrayList<Item>();
public static void main(String args[])
{
Sorting<Integer> ss=new Sorting<Integer>();
System.out.println("adding item logic started : "+Calendar.getInstance().getTime());
for(int i=0;i<90000;i++)
{
ss.list.add(i);
}
System.out.println("adding item logic ended : "+Calendar.getInstance().getTime());
//selection sort started
Calendar c1=Calendar.getInstance();
System.out.println(c1.getTime());
ss.selectionSort(ss.list);
Calendar c2=Calendar.getInstance();
System.out.println(c2.getTime());
System.out.println("selection sort time taken in seconds : "+(c2.getTimeInMillis()-c1.getTimeInMillis())/1000);
// System.out.println(ss.list);
//bubble sort started
ss.list=new ArrayList<Integer>();
for(int i=0;i<90000;i++)
{
ss.list.add(i);
}
Calendar c3=Calendar.getInstance();
System.out.println(c3.getTime());
ss.bubbleSort(ss.list);
Calendar c4=Calendar.getInstance();
System.out.println(c4.getTime());
System.out.println("bubble sort time taken in seconds : "+(c4.getTimeInMillis()-c3.getTimeInMillis())/1000);
// System.out.println(ss.list);
}
void selectionSort(List<Integer> list)
{
for(int i=0;i<list.size();i++)
{
int target=(Integer)list.get(i);
int pos=0;
for(int j=i+1;j<list.size();j++)
{//System.out.println(i+" "+j);
if(target>(Integer)list.get(j))
{
pos=j;
target=(Integer)list.get(j);
}
}
if(pos!=0)
{
Integer temp=(Integer)list.get(i);
list.set(i, (Integer)list.get(pos));
list.set(pos, temp);
}
}
}
void bubbleSort(List<Integer> list)
{
for(int i=list.size()-1;i>0;i--)
{
int status=0;
for(int j=0;j<=i-1;j++)
{
//System.out.println(i+" "+j);
if((Integer)list.get(j)>(Integer)list.get(j+1))
{
int temp=(Integer)list.get(j+1);
list.set(j+1, (Integer)list.get(j));
list.set(j, temp);
status++;
}
}
//if(status==0)break;
}
}
}
这个程序为冒泡排序提供了 85% 的更多时间,有时它是插入排序的两倍。
adding item logic started : Fri Jun 26 02:47:13 PDT 2015
adding item logic ended : Fri Jun 26 02:47:13 PDT 2015
Fri Jun 26 02:47:13 PDT 2015
Fri Jun 26 02:47:58 PDT 2015
selection sort time taken in seconds : 44
Fri Jun 26 02:47:58 PDT 2015
Fri Jun 26 02:48:46 PDT 2015
bubble sort time taken in seconds : 56
【问题讨论】:
-
请查看此链接,其中提供了有关为什么冒泡排序比选择排序花费更长时间的详细信息cs.stackexchange.com/questions/13106/…
-
@Mudassar 我浏览了这个链接,但我仍然很困惑。我在这里描述的情况是最好的情况,不需要时间交换。仍然需要更多时间。在这种情况下,选择排序除了一些赋值函数外还有两个循环,因为冒泡排序只是通过循环,理想情况下应该花费更少的时间。
-
链接中的答案还指出“......时间复杂度取决于实现和运行机器......”(可能还有更多因素。
-
@ceekay 我在同一台机器和同一程序中执行这两种算法。但是,如果在实施中存在一些问题,那么这就是我想知道的。但我找不到任何错误。
-
如前所述,冒泡排序平均每个条目需要 n/4 次交换(每个条目按元素从其初始位置移动到其最终位置,每次交换涉及两个条目),而选择sort 只需要 1(一旦找到最小值/最大值,它就会被交换一次到数组的末尾)。
标签: java algorithm bubble-sort selection-sort