算法回顾之选择排序

算法回顾之简单选择排序

概述

选择排序分为简单选择排序和堆排序,可以说,简单选择排序是最简单的排序算法之一,它十分直观,易懂,但同时,它也是能力十分强大 的堆排序的基础。


思路

简单选择排序的思路十分简单,大致如下:

每次从未排序序列中找到权值最大(最小)的项,把它放到未排序序列的最前面,或者说已排序序列的最后面,即和未排序的第一个元素互换。重复执行,知道整个序列有序。

以从小到大排序为例,考虑下面这个序列:

2 8 7 9 3 6 1

一共七个数

第一趟: 找到最小的数1 ,把它和无序序列的首个互换,构成序列 1 | 8 7 9 3 6 2

(|分割已排序和未排序序列,后面相同)

第二趟: 最小的数2,和8互换,此时序列为 1 2 | 7 9 3 6 8

第三趟: 找到最小的数3,和7互换,变成 1 2 3 | 9 7 6 8

第四趟: 找到最小的数6,和9互换,变成 1 2 3 6 | 7 9 8

第五趟: 找到最小的数7,无需变动,变成 1 2 3 6 7 | 9 8

第六趟:找到最小的数8,和9互换,变成 1 2 3 6 7 8 | 9

此时已经有序


实现

选择排序比较简单,直接上代码

#include<iostream>
#define MAXN 100
using namespace std;
void Selectsort(int a[],int n)
{
    int i,j;
    for(i=1;i<n;i++)
    {
        int minn=i;
        for(j=i+1;j<=n;j++)
            //找到无序序列中的最小值
            if(a[j]<a[minn]) minn=j;
        //如果最小值和无序序列的第一个元素不等,则互换
        if(minn!=i) {a[0]=a[i];a[i]=a[minn];a[minn]=a[0];}
    }
}
int main()
{
    int n,a[MAXN];
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    Selectsort(a,n);
    for(i=1;i<=n;i++)
    cout<<a[i]<<" ";
    return 0;
}


复杂度分析

空间复杂度

数组首位放空,作为保存最小值的中介。

空间复杂度为 O(1)

时间复杂度

最好情况和最坏情况均要比较 n1i=1ni

最好情况,移动次数为 0

最坏情况,移动3×(n1)

时间复杂度为O(n2)

Tip:还有另一种选择排序,堆排序

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