Selection Sort(选择排序法)
伪代码:
selectionSort(A, N)
for i 从 0 到 N - 1
minj = i
for j 从 i 到 N - 1
if A[j] < A[minj]
minj = j
A[i] 与 A[minj] 交换
对于选择排序法,与前两种排序方法类似,也分为已排序和未排序部分。
重复执行N - 1次下列操作
1.找出未排序部分最小值的位置minj;
2.将minj位置的元素与未排序部分的起始元素交换。
选择排序法所需的主要变量:
A[N] | 长度为N的整型数组 |
i | 循环变量,表示未排序部分的开头元素,从数组开头向末尾移动 |
minj | 各轮循环处理中,第i号到第N-1号元素中最小值的位置 |
j | 循环变量,用来查找未排序部分中最小值的位置 |
可以这么简单的理解:
第一次在所有数中挑出来一个最小的,与第一个元素交换位置;
第二次在剩下的元素中找到最小的元素,与第二个交换;
如此进行下去,直到最后一个元素即可。
AOJ例题 ALDS1_2_B:
C语言实现:
#include<stdio.h>
int selectionSort(int A[],int N){
int i, j, t, sw = 0, minj;
for(i = 0; i < N - 1; i++){
minj = i;
for( j = i; j < N; j++){
if(A[j] < A[minj]) minj = j;
}
t = A[i]; A[i] = A[minj]; A[minj] = t;
if( i != minj) sw++;
}
return sw;
}
int main(){
int A[100], N, i, sw;
scanf("%d",&N);
for(i = 0; i < N; i++) scanf("%d",&A[i]);
sw = selectionSort(A,N);
for( i = 0;i < N;i++){
if( i > 0) printf(" ");
printf("%d",A[i]);
}
printf("\n");
printf("%d\n",sw);
return 0;
}
有一个小疑问,用C++实现的一直是wrong answer,可能问题出在swap函数上,或者是循环变量的问题,等调试好再把C++的代码贴上。