选择排序数组分为“已排序部分”和“未排序部分”。
原理:
重复执行N-1次下面步骤
- 找出未排序部分最小值的位置minj;
- 将minj位置的元素与未排序部分的起始元素交换。
例:
以 A = {5,4,8,7,9,3,1}为例,选择排序过程如下:
所需要的主要变量
A[N] | 长度为N的整型数组 |
---|---|
i | 循环变量,表示未排序的开头元素,从数组开头向末尾移动 |
minj | 格轮循环处理中,第i号到第N-1号元素中最小值的位置 |
j | 循环变量,用来查找未排序部分中最小值的位置(minj) |
代码:
public class Main {
//交换数组a[i]和a[j]的值
static void swap(int[] a,int i, int j) {
a[i] = a[i]^a[j];
a[j] = a[i]^a[j];
a[i] = a[i]^a[j];
}
//打印输出数组每趟结果
static void print(int[] A, int N, int index){
System.out.println("第"+index+"次排序结果");
for(int i=0;i<N;i++) {
System.out.print(A[i]+" ");
}
System.out.println();
}
static void selectionSort(int[] A, int N){
int minj;
for(int i=0;i<N-1;i++) {
minj = i;
for(int j=i;j<N;j++) {
if(A[j]<A[minj]) {
minj = j;
}
}
if(minj != i) {
swap(A, i, minj);
}
print(A,A.length,i+1);
}
}
public static void main(String args[]) {
int[] A = {5,4,8,7,9,3,1};
selectionSort(A, A.length);
}
}
运行结果:
在每一轮循环中,通过j自增来遍历A[i]到A[N-1],从而确定minj.确定minj后,如果minj位置有变化,让起始元素A[i]和A[minj]交换。minj值如果没有变化,说明当前minj所指的元素就是未排序部分的最小元素,相当于自己和自己交换,这里省略交换。
选择算法属于不稳定算法,它需要进行(N-1)+(N-2)+…+1 = (N2 -N) / 2 次比较,所以复杂度为O(N2)。