- 没有优化版本
选择排序算法就是每次在未排序的数组里找出最大的或者是最小的,放在这个数组的开头或者是结尾,直到全部数据元素排序完成。
算法复杂度:O(n^2)
算法稳定性:不稳定
算法空间复杂度:O(1)没有借助辅助空间
C语言版本:
#include<stdio.h>
//交换数组内两个元素,将找出来的最大或者最小元素与数组开头或者结尾进行交换
void Swap(int *array,int left,int right){
int temp=array[left];
array[left]=array[right];
array[right]=temp;
}
//打印数组元素
void Print(int *array,int arraylent){
for(int i=0;i<arraylent;i++){
printf("%d ",array[i]);
}
}
//算法的核心代码,选择排序
void SelectSort(int *array,int arraylent){
for(int i=0;i<arraylent;i++){
int max=0; //最大元素的数组下标
for(int j=1;j<=arraylent-1-i;j++){
if(array[j]>array[max]){
max=j; //找到最大元素下标
}
Swap(array,max,arraylent-1-i);
}
}
Print(array,arraylent);
}
int main(){
int array[100];
int arraylent;
scanf("%d",&arraylent);
for(int i=0;i<arraylent;i++){
scanf("%d",&array[i]);
}
SelectSort(array,arraylent);
return 0;
}
- 优化版本,未优化版本在寻找时每次只寻找一次最大值或者最小值,优化版本就是每一查找把最大值与最小值同时找出来,然后完成交换
#include<stdio.h>
void swap(int *x,int *y){
int temp=*x;
*x=*y;
*y=temp;
}
void Print(int *array,int arraylen){
for(int i=0;i<arraylen;i++){
printf("%d",array[i]);
}
}
void SecletSort(int *array,int arraylen){
int maxindex=0,minindex=0;
int right=arraylen-1,left=0;
while(left<right){
minindex=left;
maxindex=left;
for(int j=left;j<=right;j++){
if(array[j]>array[maxindex]){
maxindex=j;
}else if(array[j]<array[minindex]){
minindex=j;
}
}
if(maxindex!=right){
swap(&array[maxindex],&array[right]);
}
if(minindex==right){
minindex=maxindex;
}
if (minindex!=left){
swap(&array[minindex],&array[left]);
}
right--;
left++;
}
}
int main(){
int array[]={5,4,3,2,1};
SecletSort(array,5);
Print(array,5);
return 0;
}
代码
if(minindex==right){
minindex=maxindex;
}
这个算法是先将最大值交换