大家都學習過數據結構,都知道各種各樣的排序方法,比如冒泡排序,選擇排序,堆排序,歸并排序等等,我學習的教材是C語言版的,今天處于好奇,寫了一個用Java語言實現的直接選擇排序的程序,與大家分享一下。
直接選擇排序的思想是;
n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區為R[1..n],有序區為空。
②第1趟排序
在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……
③第i趟排序
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[i]交換,使R[1..i]和R[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。
用Java實現的代碼如下:

/**//*
*@author 我為J狂 建立日期 2007-4-16
*
*/
package net.blogjava.lzqdiy;

public class MySort


{


/** *//**
* @param args
*/
public static void main(String[] args)

{
// TODO Auto-generated method stub
int n = Integer.parseInt(args[0]);// 輸入數組長度
double R[] = new double[n];
if (n == 0)
System.out.println("數組為空");
else

{
System.out.println("排序前:");
for (int i = 0; i < n; i++)
R[i] = Double.parseDouble(args[i + 1]);// 輸入數組元素。
for (int i = 0; i < n; i++)

{
if (i > 0)
System.out.print(",");
System.out.print(R[i]);
}
double temp = 0;
for (int i = 0; i < n - 1; i++)

{
for (int j = i + 1; j < n; j++)

{
if (R[j] < R[i])

{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
}
System.out.println();
System.out.println("排序后:");
for (int i = 0; i < n; i++)

{
if (i > 0)
System.out.print(",");
System.out.print(R[i]);
}
}
}
}

程序運行過程:
程序的運行結果是:
排序前:
3.6,7.4,2.1,3.3,2.0
排序后:
2.0,2.1,3.3,3.6,7.4
算法分析
(1)關鍵字比較次數 無論文件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需做n-i次比較,因此,總的比較次數為:
n(n-1)/2=0(n
2)
(2)記錄的移動次數 當初始文件為正序時,移動次數為0
文件初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。
直接選擇排序的平均時間復雜度為O(n
2)。
(3)直接選擇排序是一個就地排序
(4)穩定性分析 直接選擇排序是不穩定的
【例】反例[2,
2,1]