详细过程:
需要三个指针(i, j, m)
i--每次两数比较时较靠前的数
j--每次两数比较时较靠后的数
m--表示每次两数比较时较小的数
对于原始数组 [4, 6, 3, 9]
代码实现:
// 这是选择排序的简易版本
public class SelectSort{
// 定义一个主函数
public static void main(String[] args){
// 定义一个数组
int[] arr = {4, 6, 3, 9};
// 打印排序前的数组
System.out.println(Arrays.toString(arr));
// 调用选择排序函数
selectSort(arr);
// 打印排序后的数组
System.out.println(Arrays.toString(arr));
}
// 定义一个对无序数组进行选择排序的函数 接收一个参数 即原始数组
public static void selectSort(int[] arr){
// 首先初始化三个指针
int i, j, minIndex;
// 首先要对特殊情况进行处理
if(arr == null || arr.length < 2){
return;
}
// 定义两层循环 外层循环临时变量为i 内层循环临时变量为j
for(i = 0; i < arr.length - 1; i++){
// 定义一个指针 用于指向两数比较中较小的那个数
minIndex = i;
for(j = i + 1; j < arr.length; j++){
// 如果m指针指向的数大于j指针指向的数的话 那么就要更新m指针的指向
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
// 当内层循环完毕后 需要交换m指针指向的数和i指针指向的数
swap(arr, minIndex, i);
}
}
// 定义一个函数 用于交换两个数 接收三个参数 即原始数组、索引一、索引二
public static void swap(int[] arr, int index1, int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
但是上述做法还有优化的余地 上述做法属于单个指针向左遍历 我们可以左右两边同时设置两个指针 分别向左向右遍历其余元素 其余的做法与上述做法如出一辙
优化过后 对于原始数组 [4, 6, 3, 9]
代码优化:
import java.util.Arrays;
public class SelectSortOptimization{
// 定义一个主函数
public static void main(String[] args){
// 定义一个数组
int[] arr = {4, 6, 3, 9};
// 打印排序前的数组
System.out.println(Arrays.toString(arr));
// 调用选择排序函数对无序数组进行升序排序操作
selectSortOptimization(arr);
// 打印排序后的数组
System.out.println(Arrays.toString(arr));
}
// 定义一个函数 用于对无序数组进行选择排序 接收一个参数 即原始数组
public static void selectSortOptimization(int[] arr){
// 需要对一些特殊情况进行处理
if(arr == null || arr.length < 2){
return;
}
// 定义五个指针
int i, j, k, minIndex, maxIndex;
// 为i和j赋初始值
i = 0;
j = arr.length - 1;
// 定义两层循环 外层循环为while循环 条件为i= arr[maxIndex])
maxIndex = k;
}
// for循环完毕以后 需要交换maxIndex指针指向的数和j指针指向的数 也需要交换minIndex指针指向的数和i指针指向的数
// 首先交换一下maxIndex指针数和j指针数
int temp = arr[maxIndex];
arr[maxIndex] = arr[j];
arr[j] = temp;
// 接着如果想要交换minIndex指针数和i指针数的话 需要对一个特殊情况进行处理
// 如果minIndex指针最后指向了j指针所指向的数的话 那么前面有已经将j指针数和maxIndex指针数进行了交换 如今我们想要做的操作是将minIndex指针数(也就是原来j指针数)与i指针数进行交换 但是由于被maxIndex指针抢先一步交换 所以我们应该把minIndex指针赋值为maxIndex指针
if(minIndex == j){
minIndex = maxIndex;
}
// 交换一下i指针数和minIndex指针数
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
// 然后写完以后不要忘了条件控制语句 让i指针向左移动 j指针向右移动
i++;
j--;
}
}
}
这就是我对选择排序的理解 大家如果有什么意见可以提出来 我们一起进步!!