1.简介
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始(结束)位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾(前面)。以此类推,直到所有元素均排序完毕。
2.java代码
public static void main(String[] args) {
int[] numArray = {6,9,77,3,11,5,2};
System.out.println(arrayToString(numArray));
twoSelectSort(numArray);
System.out.println(arrayToString(numArray));
}
/**
* <一句话功能简述> 双向选择排序,每次将未排序的最小、最大元素分别放在最前和最后
* <功能详细描述> 从第一个元素开始,将第一个元素和最后一个元素默认为最小和最大,遍历
* 所有元素,找出最小和最大下标,如果最小最大下标不是第一个和最后一个,交换元素(
* 注意第二次交换时最大值是否已经交换过了);第二次以第二个元素和倒数第二个元素为
* 剩下的最小和最大,比较的范围为第二个元素至倒数第二个元素,按相同规则遍历比较,
* 直到最小下标与最大下标相遇结束。
* author: zhanggw
* 创建时间: 2022/10/15
*/
private static void twoSelectSort(int[] numArray){
if(numArray.length < 2){
return;
}
// 从第一个元素开始
for(int i=0; i<=numArray.length; i++){
// 默认第一个元素和最后一个元素为最小、最大值
int minIndex = i;
int min = numArray[minIndex];
int maxIndex = numArray.length -1-i;
int max = numArray[maxIndex];
// 最小元素下标与最大元素下标相遇,结束
if(minIndex >= maxIndex){
break;
}
// 获取第i和length-i之间的最小、最大值
for(int k=i; k<numArray.length-i; k++){
if(numArray[k] < min){
min = numArray[k];
minIndex = k;
}
if(numArray[k] > max){
max = numArray[k];
maxIndex = k;
}
}
// 安放最小、最大值
if(minIndex != i){
int tmp = numArray[i];
numArray[i] = numArray[minIndex];
numArray[minIndex] = tmp;
}
// 注意必须加max == numArray[maxIndex],以防止前面交换数据时改变max的值
if(max == numArray[maxIndex] && maxIndex != numArray.length -1-i){
int tmp = numArray[numArray.length -1-i];
numArray[numArray.length -1-i] = numArray[maxIndex];
numArray[maxIndex] = tmp;
}
}
}