一、思想
代码:
二、时间复杂度:
看似其时间复杂度就是一个for循环的大O(N),但实际上每次进行扫描最小元的时候都要做一次for循环,所以其时间复杂度是俩嵌套一起的for循环,故此其时间复杂度是:
但是,每次扫描最小元,每次取的都是最小元?怎么快速找到最小元呢?我们可以利用树中的最小堆来优化这个选择排序!这也就是堆排序的由来。
三、代码实现:
cpp
#include<stdio.h>
typedef int ElementType;
int ScanForMin(ElementType A[],int i,int N){
int j,MinPosition;
MinPosition = i;
for(j=i;j<=N;j++){
if(A[j]<A[MinPosition]){
MinPosition = j;
}
}
return MinPosition;
}
void Swap(ElementType* x,ElementType* y){
ElementType temp = *x;
*x = *y;
*y = temp;
}
void display(ElementType x[]){
int i;
for(i=0;i<10;i++){
printf("%d\t",x[i]);
}
}
void Selection_Sort(ElementType A[],int N)
{
int i,MinPosition;
for(i=0;i<N;i++){
MinPosition = ScanForMin(A,i,N-1);//从A[i]到A[N-1]寻找最小元位置赋给MinPosition
Swap(&A[i],&A[MinPosition]);//将未排序部分的最小元放到有序部分的最后位置
display(A);
printf("\n");
}
}
int main(){
ElementType A[10] = {9,8,7,6,5,4,3,2,1,0};
display(A);
printf("\n");
Selection_Sort(A,10);
return 0;
}