【算法基础】-- 选择排序篇 - 简单选择排序

选择排序基本思想是:每一趟(如第 i 趟)在后面的 n - i + 1 (i = 1 , 2 , 3 … , n - 1)[ 包括第 i 个元素 ] 个待排序元素中选取关键字最小的元素,作为有序子序列的第 i 个元素,直到第 i - 1 趟做完,待排序元素只剩下一个,就不用再选了。因为在无序表里面选择最小的元素只能是顺序查找法,并且必须每次都得扫描完整个无序表,并且除了最后一个排序的元素外,每一个元素都得考察一遍,所以这个就不存在最多进行 n - 1 次这种情况(冒泡排序),这个应该是确定的必须得走 n - 1 趟

简单选择排序每一趟排序都可以确定一个元素的最终位置

算法存储结构的适用性:个人觉得既可以采用顺序存储结构又可以采用链式存储结构,对于顺序存储结构后期会涉及到将无序表中最小的值与第 i 个位置进行交换,这种直接访问的特性,只有顺序存储结构才有,而对于链式存储结构,可以采用单链表形式,对于第 i 个元素,可以采用指针 p 指向第 i 个元素所在的节点,这样,顺序查找,找到最小元素后,直接换值或者换节点都可以 。

算法实现

/*
    简单选择排序:
        时间复杂度->最好情况:O(n^2)、平均情况:O(n^2)、最坏情况:O(n^2)
        空间复杂度->O(1)
        是否稳定->否
*/
#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 5
typedef struct{
    int key;
}ElemType;
void SelectSort(ElemType A[],int n){//升序排列
    int i,j,Min;
    for(i=0;i<n-1;i++){//对于有n个元素的待排序表,需要n-1趟选择
        Min=i;//考虑的是包括第i个及以后的元素中最小的元素
        for(j=i+1;j<n;j++){
            if(A[j].key<A[Min].key) Min=j;
        }
        if(Min!=i) swap(A[i],A[Min]);
    }//简单选择排序是不稳定的,这就类似于快速排序,当关注第i个位置的时候,只要有比它小的,就会与它进行交换
    //如:4 4 2,这时就会不稳定
}
int main(){
    ElemType A[]={{5},{4},{3},{2},{1}};
    SelectSort(A,MAX_SIZE);
    for(int i=0;i<MAX_SIZE;i++){
        cout<<A[i].key<<' ';
    }
    return 0;
}
发布了83 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42127861/article/details/103101618
今日推荐