1.默认选择排序算法实现
思路:记录最小数下标,重复一轮后,调换最小位置和前面位置,重复此过程。
特点:耗时,并且还不稳定,所以基本不会用到
private void selectSort(){
int[] array = {5,4,3,7,8,2,1,9,6};
for (int i = 0;i<array.length - 1;i++){//边界处理
int minPos = i;
for (int index = i+1;index < array.length ;index++){
minPos = array[index] < array[minPos] ? index:minPos;//优化为一条语句
}
System.out.println("minPos:"+minPos+",minPosVal:"+array[minPos]);
swap(array,i,minPos);
}
logger.info(JSON.toJSONString(array));
}
private void swap(int[] arr,int x,int y){
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
2.优化后的选择排序算法
思路:记录最小数、最大数下标,重复一轮后,调换最小位置和前面记录位置,调换最大值和数组后面值,重复此过程。相比于默认选择排序,理论降低一半时间,时间复杂度虽然还是O(n^2)。
/**出最小值和最大值,并交换。注意最大值位置处于最小值即将替换的位置时,需要特殊处理
*/
private void optimizationSelectSort() {
int[] arrayRandom = new int[100];
int[] arrayRandomCalcul = new int[arrayRandom.length];
Random random = new Random();
for (int i = 0; i < arrayRandom.length; i++) {
arrayRandom[i] = random.nextInt(arrayRandom.length);
}
System.arraycopy(arrayRandom,0,arrayRandomCalcul,0,arrayRandom.length);
for (int i = 0; i < (int) Math.ceil(arrayRandomCalcul.length / 2.); i++) {//循环数组一半即可
int minPos = i, maxPos = i;
for (int j = i+1; j < arrayRandomCalcul.length - i; j++) {//一次排序2个值,前后各1个
minPos = arrayRandomCalcul[j] < arrayRandomCalcul[minPos] ? j : minPos;
maxPos = arrayRandomCalcul[j] > arrayRandomCalcul[maxPos] ? j : maxPos;
}
int tempMaxVal = arrayRandomCalcul[maxPos];
swap(arrayRandomCalcul, i, minPos);
maxPos = arrayRandomCalcul[minPos] == tempMaxVal ? minPos : maxPos;//[9,3,1,4],此时minPos=2,maxPos=0,调换最小值后,arr[minPos]=9,maxPos必须修改为2
swap(arrayRandomCalcul, arrayRandomCalcul.length - 1 - i , maxPos);
// logger.info("排序值:" + JSON.toJSONString(arrayRandomCalcul));
}
//开始检验算法是否正确
Arrays.sort(arrayRandom);
for (int k = 0; k < arrayRandom.length; k++) {
if (arrayRandom[k] != arrayRandomCalcul[k]) {
logger.info("自定义算法存在问题,目标位置、值{}:{},计算位置、值{}:{}", k, arrayRandom[k], k, arrayRandomCalcul[k]);
break;
}
}
logger.info("排序值:" + JSON.toJSONString(arrayRandomCalcul));
}
private void swap(int[] arr,int x,int y){
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}