在計(jì)算機(jī)科學(xué)中,排序算法是一項(xiàng)重要的任務(wù)。選擇排序是一種簡(jiǎn)單而高效的排序算法,它通過(guò)不斷選擇最?。ɑ蜃畲螅┑脑?,并將其放置在已排序部分的末尾,逐步完成對(duì)整個(gè)列表的排序。本文將詳細(xì)解析選擇排序算法的原理、步驟和性能分析。
選擇排序是什么?
選擇排序(Selection Sort)是一種簡(jiǎn)單而直觀的排序算法,它的基本思想是每次從未排序的元素中選擇最小(或最大)的元素,并將其放置在已排序部分的末尾。通過(guò)不斷重復(fù)這個(gè)過(guò)程,直到所有元素都被放置在正確的位置上,完成整個(gè)列表的排序。
算法步驟
- 遍歷未排序部分的每個(gè)元素。
- 在當(dāng)前未排序部分中找到最?。ɑ蜃畲螅┑脑?。
- 將最小(或最大)元素與未排序部分的第一個(gè)元素進(jìn)行交換。
- 將交換后的元素視為已排序部分的末尾。
- 重復(fù)上述步驟,直到所有元素都被放置在正確的位置上。
代碼示例
下面是使用Java語(yǔ)言實(shí)現(xiàn)冒泡排序的示例代碼:
import java.util.Arrays;
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
// 遍歷數(shù)組
for (int i = 0; i < n-1; i++) {
int min = i;
//遍歷選擇最小的數(shù)
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[min]) min = j;
}
//交換位置
swap(arr, i, min);
}
}
private static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
性能分析
- 時(shí)間復(fù)雜度:選擇排序的時(shí)間復(fù)雜度為O(n^2),其中n是待排序列表的長(zhǎng)度。由于需要進(jìn)行兩層循環(huán),每一輪都需遍歷未排序部分。
- 空間復(fù)雜度:選擇排序的空間復(fù)雜度為O(1),因?yàn)橹恍枰A考?jí)的額外空間進(jìn)行元素交換。
- 穩(wěn)定性:選擇排序是一種不穩(wěn)定的排序算法,因?yàn)橄嗟仍乜赡茉诮粨Q過(guò)程中改變相對(duì)順序。