基本介绍
选择排序属于内部排序法,是从待排序的数组中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 选择排序(select sorting)是一种简单的排序方法。它的思想是:第一次从arr[0] – arr[n-1]中选取最小值,与arr[0]交换。第二次从arr[1] – arr[n-1]中选取最小值与arr[1]交换。第三次从arr[2] – arr[n-1]中选取最小值与arr[2]交换。以此类推,第i次从arr[i-1] – arr[n-1]中选取最小值与arr[i-1]交换,第n-1次从arr[n-2] – arr[n-1]中选取最小值与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大的有序序列。
推导过程
原始数组:101,34,11,1
1,34,11,101
1,11,34,101
1,11,34,101
说明: (1)选择排序一共有数组大小减1轮排序 (2)每1轮排序,又是一个循环 (3)先假定当前这个数是最小数 (4)然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标 (5)当遍历到数组的最后时,就得到本轮最小数和下标
代码分解
public class SelectSort {
public static void main(String[] args) {
int[] arr = {101,34,11,1};
selectSort(arr);
}
public static void selectSort(int[] arr) {
int min = arr[0];
int minIndex = 0;
for (int j = (0 + 1); j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
if (0 != minIndex) {
arr[minIndex] = arr[0];
arr[0] = min;
}
System.out.println("第一趟排序结果:" + Arrays.toString(arr));
min = arr[1];
minIndex = 1;
for (int j = (1 + 1); j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
if (1 != minIndex) {
arr[minIndex] = arr[1];
arr[1] = min;
}
System.out.println("第二趟排序结果:" + Arrays.toString(arr));
min = arr[2];
minIndex = 2;
for (int j = (2 + 1); j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
if (2 != minIndex) {
arr[minIndex] = arr[2];
arr[2] = min;
}
System.out.println("第三趟排序结果:" + Arrays.toString(arr));
}
}
运行结果: 第一趟排序结果:[1, 34, 11, 101] 第二趟排序结果:[1, 11, 34, 101] 第三趟排序结果:[1, 11, 34, 101]
优化代码
public class SelectSort {
public static void main(String[] args) {
int[] arr = {101,34,11,1};
selectSort(arr);
}
public static void selectSort (int[] arr) {
for (int i = 0; i < (arr.length - 1); i++) {
int min = arr[i];
int minIndex = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
if (i != minIndex) {
arr[minIndex] = arr[i];
arr[i] = min;
}
}
System.out.println(Arrays.toString(arr));
}
}
|