每日一算法--选择排序算法

  • 没有优化版本
    选择排序算法就是每次在未排序的数组里找出最大的或者是最小的,放在这个数组的开头或者是结尾,直到全部数据元素排序完成。
    算法复杂度: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;
                }

这个算法是先将最大值交换

发布了40 篇原创文章 · 获赞 9 · 访问量 3293

猜你喜欢

转载自blog.csdn.net/weixin_44706647/article/details/101003046