每日一算法--選擇排序算法

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

這個算法是先將最大值交換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章