选择排序
选择排序改进了冒泡排序,将必要的交换次数从O(n2)减少到了O(N),不幸的是比较次数仍然保持为O(N2),然而选择排序仍然为大记录量的排序提出了一个非常了不去的重要的改进,因为这些记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要.(一般来说,在java中不是这种情况,java中只是改变了引用位置,而实际对象的位置并没有发生改变。)
// selectSort.java
// demonstrates selection sort
// to run this program: C>java SelectSortApp
class ArraySel
{
private long[] a; // ref to array a
private int nElems; // number of data items
//--------------------------------------------------------------
public ArraySel(int max) // constructor
{
a = new long[max]; // create the array
nElems = 0; // no items yet
}
//--------------------------------------------------------------
public void insert(long value) // put element into array
{
a[nElems] = value; // insert it
nElems++; // increment size
}
//--------------------------------------------------------------
public void display() // displays array contents
{
for(int j=0; j<nElems; j++) // for each element,
System.out.print(a[j] + " "); // display it
System.out.println("");
}
//--------------------------------------------------------------
public void selectionSort()
{
int out, in, min;
for(out=0; out<nElems-1; out++) // outer loop
{
min = out; // minimum
for(in=out+1; in<nElems; in++) // inner loop
if(a[in] < a[min] ) // if min greater,
min = in; // we have a new min
swap(out, min); // swap them
} // end for(out)
} // end selectionSort()
//--------------------------------------------------------------
private void swap(int one, int two)
{
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
//--------------------------------------------------------------
} // end class ArraySel
class SelectSortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArraySel arr; // reference to array
arr = new ArraySel(maxSize); // create the array
arr.insert(77); // insert 10 items
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
arr.display(); // display items
arr.selectionSort(); // selection-sort them
arr.display(); // display them again
} // end main()
} // end class SelectSortApp
选择排序的效率
选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2。对于10个数据,需要45次比较。然而10个数据需要少于10次交换,对于100个数据,需要4950次比较,但只进行了不到100次交换,N值很大时,比较次数是主要的,所以结论是选择排序和冒泡排序一样运行了O(N2)时间。但是,选择排序无疑更快,因为它进行的交换少的多,当N值较小时,特别是如果交换的时间比比较的时间级大得多时,选择排序实际上是相当快的。