- 沒有優化版本
選擇排序算法就是每次在未排序的數組裏找出最大的或者是最小的,放在這個數組的開頭或者是結尾,直到全部數據元素排序完成。
算法複雜度: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;
}
這個算法是先將最大值交換