选择排序的算法
package com.lgh.pt;
/** 选择排序 */
public class SelectionSort {
public static void main(String[] args) {
int [] arr= {5,3,6,8,1,7,9,4,2};
//假设最小值在0的位置
int minPos=0;
int temp;
for (int i = 0; i < arr.length; i++) {
minPos=i;
for (int j = i+1; j < arr.length; j++) {
if(arr[minPos]>arr[j]){
//重新排序数组下标
minPos=j;
}
}
//将找到的值赋到相应的位置
temp=arr[i];
arr[i]=arr[minPos];
arr[minPos]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
优化后:
package com.lgh.pt;
/** 选择排序 */
public class SelectionSort {
public static void main(String[] args) {
int [] arr= {5,3,6,8,1,7,9,4,2};
//假设最小值在0的位置
int minPos=0;
int temp;
for (int i = 0; i < arr.length-1; i++) {
minPos=i;
for (int j = i+1; j < arr.length; j++) {
if(arr[minPos]>arr[j]){
//重新排序数组下标
minPos=j;
}
}
//将找到的值赋到相应的位置
swap(arr,i,minPos);
System.out.println("经过第"+i+"次循环之后,数组的内容:");
print(arr);
}
}
static void print(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
static void swap(int [] arr,int i, int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
最后一次优化:
package com.lgh.pt;
/** 选择排序
*
* 优化:1.找到最小值的同时找最大值将最大值移到后边去
*
* */
public class SelectionSort {
public static void main(String[] args) {
int [] arr= {5,3,6,8,1,7,9,4,2};
//假设最小值在0的位置
int minPos=0;
int max;
for (int i = 0; i < arr.length/2; i++) {
max=arr.length-i-1;
minPos=i;
for (int j = i+1; j < arr.length-i; j++) {
if(arr[minPos]>arr[j]){
//重新排序数组下标
minPos=j;
}else if(arr[max]<arr[j]){
max=j;
}
}
//将找到的值赋到相应的位置
swap(arr,i,minPos);
swap(arr,arr.length-i-1,max);
System.out.println("经过第"+i+"次循环之后,数组的内容:");
print(arr);
}
}
static void print(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
static void swap(int [] arr,int i, int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
为什么不直接写出最终版呢?
答:个人觉得这个过程很重要很重要,因为每次书写代码都不可能一次性的写成最完美的,我这个也是相对完美一些