选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
我们还是以数据 int[] arr = {3, 1, 4, 2}; 为例
第一轮循环
我们定义一个默认角标值int minIndex,来存储最小元素角标,默认等于当前循环的起始值也就是minIndex=0,
第一次比较:minIndex和角标1 去比较,发现角标minIndex的元素大于角标1的元素,
此时我们把角标1赋值给我们的默认角标值,此时minIndex=1
第二次比较:我们让角标minIndex和角标2 去比较,minIndex的元素小于角标是2的元素,不做任何处理
第三次比较:我们让角标minIndex和角标3比较,minIndex的元素小于角标是3的元素,不做任何处理
第一轮比较下来,我们找到了最小元素的角标,
我们让角标为0的元素和角标为minIndex的元素交换位置。此时数据为[1,3,4,2]
第二轮比较:
第一次比较:由于角标0的值已经是数组中最小的值,我们第二轮比较时,直接把角标1设置为minIndex的值 minIndex=1,
然后让minIndex和角标2的元素进行比较,角标为2的元素大于角标minIndex的值不做任何处理,[1,3,4,2]
第二次比较:角标minIndex和角标为3的元素比较,发现角标为3的元素小于角标为minIndex的元素,把minIndex的值设置为3
然后我们把角标为1的元素和角标为3的元素换下位置,此时数组为[1,2,4,3]
第三轮比较:
这一次我们的minIndex=2了,前面数据都已经排好序了,
我们比较下 minIndex和角标3,发现角标3的元素大于角标minIndex的元素,
把角标3赋值给minIndex,minIndex=3。
角标为2的数据和角标为3的数据交换。此时数组为[1,2,3,4] ,到此我们的循环就结束了。
如果我们有N个数据的话,我们一共执行了N-1轮的循环,每轮循环起始位置比上次循环多一个角标,代码实现如下,
*
* @param arr
*/
public static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
网友评论