java中数组的排序——选择排序的两种方式比较
NumSort.java
//数组排序
public class NumSort {
public static void main(String[] args) {
//拿到args数组的长度,为a数组的空间大小
int[] a = new int[args.length];
for (int i=0; i<args.length; i++) {
//将args数组中的值转换为int
a[i] = Integer.parseInt(args[i]);
}
System.out.println("排序前");
//打印数组a
print(a);
//选择排序数组a
selectionSort(a);
System.out.println("排序后");
//打印数组a
print(a);
}
//打印数组a
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
//选择排序数组a
/*
分析算法:
排序前 2 4 1 3 8 7 6 5 9 0
_
i=0 1 4 2 3 8 7 6 5 9 0
0 4 2 3 8 7 6 5 9 1
_
i=1 0 2 4 3 8 7 6 5 9 1
0 1 4 3 8 7 6 5 9 2
_
i=2 0 1 3 4 8 7 6 5 9 2
0 1 2 4 8 7 6 5 9 3
_
i=3 0 1 2 3 8 7 6 5 9 4
_
i=4 0 1 2 3 7 8 6 5 9 4
0 1 2 3 4 8 6 5 9 7
_
i=5 0 1 2 3 4 7 6 5 9 8
0 1 2 3 4 6 7 5 9 8
0 1 2 3 4 5 7 6 9 8
_
i=6 0 1 2 3 4 5 6 7 9 8
_
i=7 0 1 2 3 4 5 6 7 9 8
_
i=8 0 1 2 3 4 5 6 7 8 9
_
i=9 0 1 2 3 4 5 6 7 8 9
*/
private static void selectionSort(int[] a) {
//拿出第一个数a[i]和后面的每一个数进行比较
for(int i=0; i<a.length; i++) {
//下一个数a[j]
for(int j=i+1; j<a.length; j++) {
//从小到大进行排列,如果第一个数大于后面的数,则交换
if(a[j] < a[i]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
//选择排序的算法优化,最小的值只交换一次,位置交换
/*
可读性和效率
分析算法:
0 1 2 3 4 5 6 7 8 9
- - - - - - - - - -
排序前 2 4 1 3 8 7 6 5 9 0
i=0,k = 0
2
9
0 4 1 3 8 7 6 5 9 2
i=1,k = 1
2
0 1 4 3 8 7 6 5 9 2
i=2,k = 2
3
9
0 1 2 3 8 7 6 5 9 4
i=3,k = 3
i=4,k = 4
5
6
7
9
0 1 2 3 4 7 6 5 9 8
i=5,k = 5
6
7
0 1 2 3 4 5 6 7 9 8
i=6,k = 6
i=7,k = 7
i=8,k = 8
9
0 1 2 3 4 5 6 7 8 9
*/
private static void selectionSort2(int[] a) {
int k, temp;
for(int i=0; i<a.length; i++) {
//k为最小的数的位置
k = i;
for(int j=k+1; j<a.length; j++) {
if(a[j] < a[k]) {
//将数的位置调换
k = j;
}
}
//如果k的位置不等于i的位置,交换
if(k != i) {
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
}
F:\java>javac NumSort.java F:\java>java NumSort 2 4 1 3 8 7 6 5 9 0 排序前 2 4 1 3 8 7 6 5 9 0 排序后 0 1 2 3 4 5 6 7 8 9 F:\java>