欢迎来到算法小课堂,今天讲解的内容是选择排序。
选择排序的基本思想是:
首先,将数组分为已排序区间和未排序区间。
然后,找出未排序区间中最小(大)的元素,放在已排序区间的末尾。重复这个过程,直到未排序区间的元素全部考察完毕。
01
题目解析
TOPIC ANALYSIS
接下来,我们以数组{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来说,重复上述过程即可完成排序。
02
代码实现
CODE
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;}