基本思想:
首先,将数组分为已排序区间和未排序区间。
然后,找出未排序区间中最小(大)的元素,放在已排序区间的末尾。重复这个过程,直到未排序区间的元素全部考察完毕。
题目解析
数组{1, 2, 5, 3, 4}排序
元素1和2处在已排序区间,而元素5、3、4则处在未排序区间
定义变量i指向未排序区间的第一个元素5;定义变量minIndex,其初始值为变量i的值;定义变量j,其初始值为i+1
将变量j所指向的元素和变量minIndex所指向的元素进行比较,如果变量j所指向的元素值小于变量minIndex所指向的元素值,则将变量j的值赋予变量minIndex。
在这里,j所指向的元素为3,小于minIndex所指向的元素5,因此,将变量j的值赋予变量minIndex,即minIndex指向j所指向的元素。
继续考察下一个元素,即将变量j加1。
变量j所指向的元素值大于变量minIndex所指向的元素值,且变量j指向数组的末尾。因此,变量minIndex所指向的元素3,就是未排序区间中最小的元素。
接下来要做的就是将变量i所指向的元素5和变量minIndex所指向的元素3,进行位置交换。
元素3处于已排序区间的末尾
对于未排序区间的元素5和4来说,重复上述过程即可完成排序。
代码实现
public void selectionSort(int[] arr) {
for(int i = 0; i < arr.length; i++) {
int minIndex = i;
for(int j = i + 1; j < arr.length; j++) {
if (arr[j] - arr[minIndex] < 0) {
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
private void swap(int[] arr, int m, int n) {
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}