1、冒泡排序
要将最小的数据项放在数组的最开始,最大的数据项放在数组的最后。
队列编号为0,1,2,...,nElems-1。从队列的最左边开始,比较0号位置和1号位置的队员。如果0号位置队员的高,则让两个队员交换。如果右边的队员高则什么都不做。然后右移一个位置,比较1号位置和二号位置的队员,如果左边队员高则两个队员交换位置。这样比较下去,一直比较到队列的最右端。虽然还没有完全把所有队员都排好序,但是最高的队员已经排在最右边了。
out表示从编号为nElems-1的人开始,到编号为1的人结束。每次外部循环时,in从编号为0的人开始,到编号为out的人结束,内部循环中当前面的身高大于紧随其后的人的身高时,则交换两个人的位置。每次内部循环结束后,都能找到一个最高的人放在out位置上。out位置向前移一位,继续排序前面的。
比较次数:N*N/2 交换次数:N*N/4
class ArrayBub
{
private long[] a; // ref to array a
private int nElems; // number of data items
//--------------------------------------------------------------
public ArrayBub(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 bubbleSort()
{
int out, in;
for(out=nElems-1; out>0; out--) // outer loop (backward)
for(in=0; in<out; in++) // inner loop (forward)
if( a[in] > a[in+1] ) // out of order?
swap(in, in+1); // swap them
} // end bubbleSort()
//--------------------------------------------------------------
private void swap(int one, int two)
{
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
//--------------------------------------------------------------
} // end class ArrayBub
////////////////////////////////////////////////////////////////
class BubbleSortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArrayBub arr; // reference to array
arr = new ArrayBub(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.bubbleSort(); // bubble sort them
arr.display(); // display them again
} // end main()
} // end class BubbleSortApp
2、选择排序
要将最小的数据项放在数组的最开始,最大的数据项放在数组的最后。
队列编号为0,1,2,...,nElems-1。排序从球员队列的最左边开始。在记录本上记录下最左端球员的身高,并且把紫红色的毛巾放在这个队员的前面。于是开始用下一个球员的身高和记录本上记录的值相比较。如果这个队员更矮,则划掉第一个球员的身高,记录下第二个队员的身高,同时移动毛巾,把它放在这个新的"最矮的"队员前面。继续沿着队列走下去,每一个队员都合记录本上的最小值进行比较。当发现更矮的队员时,就更新记录本上的最小值并且移动毛巾。做完这些事情后,毛巾就会落在最矮的队员前面。这个最矮的队员和队列最左边的队员交换位置。这样位置0就确定了,接着从位置1开始一直到队列的最后,同样找到一个最矮的队员放在1位置上。接着从位置2开始。。。
比较次数:N*N/2 交换次数:N
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()
public void selectionSort2()
{
int out, in, max;
for(out=nElems-1; out>0; out--) // outer loop
{
max = out; // minimum
for(in=0; in<out; in++) // inner loop
if(a[in] > a[max] ) // if min greater,
max = in; // we have a new min
swap(out, max); // 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
////////////////////////////////////////////////////////////////
3、插入排序
要将最小的数据项放在数组的最开始,最大的数据项放在数组的最后。
假设队列已局部有序,在队列的某个位置有一个作为标记的队员,在这个作为标记的队员左边的所有队员已经排好序了。然而这些队员在队列的最终的位置还没有确定,因为当没有被排过序的队员要插入到他们中间的时候,他们的位置还要发生变动。将这个标记的队员与左边的队员一一比较,当该队员比左边的队员矮,则继续比较左左边的队员,这样一直比较直到找到一个比他矮的队员则该标记队员插入到这个队员的后面。
比较次数:N*N/2 复制次数:N*N/4
复制次数大致等于比较的次数。然而,一次复制与一次交换的时间耗费不同,相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。
对于已经有序或基本有序的数据来说,插入排序要好得多。当数据有序时,算法只需O(N)的时间。
对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒牌排序快。
class ArrayIns
{
private long[] a; // ref to array a
private int nElems; // number of data items
//--------------------------------------------------------------
public ArrayIns(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 insertionSort()
{
int in, out;
for(out=1; out<nElems; out++) // out is dividing line
{
long temp = a[out]; // remove marked item
for(in=out-1;in>=0;in--){
if(a[in]>temp){
a[in+1]=a[in];
}
else{
break;
}
}
a[in+1]=temp;
// in = out; // start shifts at out
// while(in>0 && a[in-1] >= temp) // until one is smaller,
// {
// a[in] = a[in-1]; // shift item to right
// --in; // go left one position
// }
// a[in] = temp; // insert marked item
} // end for
} // end insertionSort()
//--------------------------------------------------------------
} // end class ArrayIns
////////////////////////////////////////////////////////////////
class InsertSortApp
{
public static void main(String[] args)
{
int maxSize = 100; // array size
ArrayIns arr; // reference to array
arr = new ArrayIns(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(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
arr.display(); // display items
arr.insertionSort(); // insertion-sort them
arr.display(); // display them again
} // end main()
} // end class InsertSortApp