3.选择排序

2018-07-24  本文已影响0人  吴金君

3.选择排序

3.1选择排序的思想和复杂度

选择排序思想

选择排序可以说是最简单的排序方法,通过对一个长度为N的数组扫描N次来完成排序。第一次扫描找到最小值,替换到数组的第一个下标处;第二次找到次小值,替换到数组的第二个下标处。

时间和空间复杂度

时间复杂度如表所示

算法 平均情况 最好情况 最差情况
冒泡 O(N^2) O(N^2) O(N^2)

空间复杂度:O(1)

3.2选择排序的操作

假设有这样一个数组vec:

下标 0 1 2 3 4 5 6 7 8 9
数组 4 3 5 2 1 9 8 6 0 7

对这个数组进行选择排序,同样需要一外层循环和内层循环来完成。
内层循环的目的是在每一轮扫描中找到当前轮次中的最小值。
外层循环的目的是找到数组的最小值,次小值,再次小值...直到次大值,最大值。

内层循环(i<=j<vec.size(), j++)

可以通过下表理解内层循环寻找当前轮次中的最小值:

指针 i
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i&j&min
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j&min
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j&min
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j&min
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j&min
原始数组 4 3 5 2 1 9 8 6 0 7
指针 i j
原始数组 0 3 5 2 1 9 8 6 4 7

外层循环(0<i<vec.size() ,i++)

可以通过下表理解外层循环的交换:

指针 i
原始数组 4
指针 i
更新数组 0 1
指针 i
更新数组 0 1 2
指针 i
更新数组 0 1 2 3
...
指针 i
更新数组 0 1 2 3 4 5 6 7 8 9

OK, 可以上代码了。

3.3 C++代码

#include <iostream>
#include <vector>
using namespace std;

class Sort
{
public:
    void select(vector<int> &vec)
    {
        int number=vec.size();
        vector<int> nullvec;
        if(number==0)return;
        int min=vec[0];
        for(int i=0;i<number;i++)
        {
            min=i;
            for(int j=i;j<number;j++)
            {
                if(vec[j]<vec[min])min=j;
            }
            if(i!=min)exch(vec,i,min);

            show(vec);
        }
    }
    void show(vector<int> &vec)
    {
        for(int i=0;i<vec.size();i++)
        {
            cout << vec[i] << " ";
        }
        cout << endl;
    }
    vector<int> init()
    {
        vector<int> vec;
        int arr[10]={4,3,5,2,1,9,8,6,0,7};
//        int arr[10]={9,8,7,6,5,4,3,2,1,0};
        vec.insert(vec.begin(),arr,arr+10);
        cout <<"ori:"<<endl;
        show(vec);
        cout <<"-------------------"<<endl;
        return vec;
    }
    bool checkorder(vector<int> &vec)
    {
        for(int i=0;i<vec.size()-1;i++)
        {
            if(vec[i]>vec[i+1])return false;
        }
        return true;
    }
private:
    void exch(vector<int> &vec,int a,int b)
    {
        int tmp;
        tmp=vec[a];
        vec[a]=vec[b];
        vec[b]=tmp;
    }
};

int main()
{
    Sort sortob;
    vector<int> mvec=sortob.init();
    sortob.select(mvec);
    cout <<"------result-------"<<endl;
    if(sortob.checkorder(mvec))
        sortob.show(mvec);
    else
    {   cout << sortob.checkorder(mvec);
    }
    return 0;
}

输出结果:

image.png
上一篇下一篇

猜你喜欢

热点阅读