選擇排序(Selection Sort)算法也是比較簡(jiǎn)單的排序算法骤菠,其思路比較直觀。選擇排序算法在每一步中選取最小值來重新排序,從而達(dá)到排序的目的积仗。
選擇排序算法
選擇排序算法通過選擇和交換來實(shí)現(xiàn)排序,其排序流程如下:
⑴首先從原始數(shù)組中選擇最小的1個(gè)數(shù)據(jù)蜕猫,將其和位于第1個(gè)位置的數(shù)據(jù)交換寂曹。
⑵接下來從剩下的n-1個(gè)數(shù)據(jù)中選擇次小的1個(gè)數(shù)據(jù),將其和第2個(gè)位置的數(shù)據(jù)交換回右。
⑶然后不斷重復(fù)上訴過程隆圆,直到最后兩個(gè)數(shù)據(jù)完成交換。至此翔烁,便完成了對(duì)原始數(shù)組的從小到大的排序渺氧。
為了更好地理解選擇排序算法的執(zhí)行過程,下面舉一個(gè)實(shí)際數(shù)據(jù)的例子來一步一步地執(zhí)行選擇排序算法蹬屹。5個(gè)整型數(shù)據(jù)118侣背、101、105哩治、127秃踩、112是一組無序的數(shù)據(jù)。對(duì)其執(zhí)行選擇排序過程业筏,如圖1所示憔杨。
選擇排序算法的執(zhí)行步驟如下:
⑴第一次排序,從原始數(shù)組中選擇最小的數(shù)據(jù)蒜胖,這個(gè)數(shù)據(jù)便是101消别,將其與第1個(gè)數(shù)據(jù)118進(jìn)行交換。此時(shí)排序后的數(shù)據(jù)為101台谢,118寻狂,105,127朋沮,112蛇券。
⑵第二次排序,從剩余的數(shù)組中選擇最小的數(shù)據(jù),這個(gè)數(shù)據(jù)便是105纠亚,將其與第2個(gè)數(shù)據(jù)118進(jìn)行交換塘慕。此時(shí)排序后的數(shù)據(jù)為101、105蒂胞、118图呢、127、112骗随。
⑶第三次排序蛤织,從剩余的數(shù)組中選擇最小的數(shù)據(jù),這個(gè)數(shù)據(jù)便是112鸿染,將其與第3個(gè)數(shù)據(jù)118進(jìn)行交換指蚜。此時(shí)排序后的數(shù)據(jù)為101、105牡昆、112姚炕、127、118丢烘。
⑷第四次排序,從剩余的數(shù)組中選擇最小的數(shù)據(jù)些椒,這個(gè)數(shù)據(jù)便是118播瞳,將其與第4個(gè)數(shù)據(jù)127進(jìn)行交換。此時(shí)排序后的數(shù)據(jù)為101免糕、105赢乓、112、127石窑、118牌芋。
從上面的例子可以非常直觀的了解到選擇排序算法的執(zhí)行過程。選擇排序算法在對(duì)n個(gè)數(shù)據(jù)進(jìn)行排序時(shí)松逊,無論袁術(shù)就有無順序躺屁,都需要進(jìn)行n-1步的中間排序。這種排序方法思路很簡(jiǎn)單直觀经宏,但是缺點(diǎn)是執(zhí)行的步驟稍長(zhǎng)犀暑,效率不高。
選擇排序算法的示例代碼如下:
void selectSort(int[] a) {
int index;
int temp;
for (int i = 0; i < a.length - 1; i++) {
index = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[index]) {
index = j;
}
}
if (index != i) {
temp = a[i];
a[i] = a[index];
a[index] = temp;
}
System.out.print("第" + (i + 1) + "步排序結(jié)果:"); // 輸出每步排序的結(jié)果
for (int h = 0; h < a.length; h++) {
System.out.print(" " + a[h]);
}
System.out.println("\n");
}
}
在上述代碼中烁兰,輸入?yún)?shù)a一般為一個(gè)數(shù)組的首地址耐亏。待排序的原數(shù)據(jù)便保存在數(shù)組a中,程序中通過兩層循環(huán)來對(duì)數(shù)據(jù)進(jìn)行排序沪斟」愠剑可以結(jié)合前面的選擇排序算法來加深理解。為了更清楚排序算法的執(zhí)行過程,在排序的每一步都輸出了當(dāng)前的排序結(jié)果择吊。
選擇排序算法實(shí)例
學(xué)習(xí)了前面的選擇排序算法的基本思想和算法之后李根,下面通過一個(gè)完整的例子來說明選擇排序法在整型數(shù)組排序中的應(yīng)用,程序示例如下:
【程序】
public class SelectionSort {
static final int SIZE = 10;
public static void selectSort(int[] a) {
int index, temp;
for (int i = 0; i < a.length - 1; i++) {
index = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[index]) {
index = j;
}
}
if (index != i) {
temp = a[i];
a[i] = a[index];
a[index] = temp;
}
System.out.print("第" + (i + 1) + "步排序結(jié)果:"); // 輸出每步排序的結(jié)果
for (int h = 0; h < a.length; h++) {
System.out.print(" " + a[h]);
}
System.out.println("\n");
}
}
public static void main(String[] args) {
int[] shuzu = new int[SIZE];
int i;
for (i = 0; i < SIZE; i++) {
shuzu[i] = (int) (100 + Math.random() * (100 + 1));
}
System.out.print("排序前的數(shù)組為: \n");
for (i = 0; i < SIZE; i++) {
System.out.print(shuzu[i] + " ");
}
System.out.print("\n");
selectSort(shuzu);
System.out.print("排序后的數(shù)組為: \n");
for (i = 0; i < SIZE; i++) {
System.out.print(shuzu[i] + " ");
}
System.out.print("\n");
}
}
在上訴代碼中干发,程序定義了符號(hào)常量SIZE朱巨,用于表征需要排序整型數(shù)組的大小。在主方法中枉长,首先聲明一個(gè)整型數(shù)組冀续,然后對(duì)數(shù)組進(jìn)行隨機(jī)初始化,并輸出排序前的數(shù)組內(nèi)用必峰。接著洪唐,調(diào)用選擇排序算法方法來對(duì)數(shù)組進(jìn)行排序。最后吼蚁,輸出排序后的數(shù)組凭需。
該程序的執(zhí)行結(jié)果,如圖2所示肝匆。圖中顯示了每一步排序的中間結(jié)果粒蜈。