选择排序 C++版

一、 选择排序

1、选择排序

找到数组中最小的元素放到第一个位置,找到数组中第二个最小的元素放到第二个位置。。。直到所有的元素都在合适的位置为止。

2、优缺点

优点:1、赋值次数少
缺点:1、所有情况下的交换次数都一样
算法复杂度:O(n~n^2) 空间复杂度:O(n)+辅助变量空间

二、测试代码

#include <iostream>
#include <vector>

using namespace std;

/************************
选择排序:找到数组中最小的元素放到第一个位置,找到数组中第二个最小的元素
放到第二个位置。。。直到所有的元素都在合适的位置为止。
优点:1、赋值次数少
缺点:1、所有情况下的交换次数都一样
算法复杂度:O(n~n^2) 空间复杂度:O(n)+辅助变量空间
*************************/

// 实现方法一
template<typename T>
void selectSort1(T data[], int n)
{
    int min = 0;
    for(int i=0; i<n-1; i++)
    {
        min=i;
        for(int j=i+1; j<n; j++)
        {
            if(data[j]<data[min])
            {
                min = j;
            }
        }
        T temp = data[min];
        data[min] = data[i];
        data[i] = temp;
    }
}

// 实现方法二 改进版
template<typename T>
void selectSort2(T data[], int n)
{
    int min = 0;
    for(int i=0; i<n-1; i++)
    {
        min=i;
        for(int j=i+1; j<n; j++)
        {
            if(data[j]<data[min])
            {
                min = j;
            }
        }
// 此改进版对数值和字符操作时效率并没有提高多少,但是当判断的是
// 结构体等复合类型时可以减少赋值的次数,提高了效率
        if(min != i)
        {
            T temp = data[min];
            data[min] = data[i];
            data[i] = temp;
        }
    }
}

// 实现方法三 改进版
template<typename T>
void selectSort3(vector<T> &data)
{
    int min = 0;
    for(int i=0; i<data.size()-1; i++)
    {
        min=i;
        for(int j=i+1; j<data.size(); j++)
        {
            if(data[j]<data[min])
            {
                min = j;
            }
        }
// 此改进版对数值和字符操作时效率并没有提高多少,但是当判断的是
// 结构体等复合类型时可以减少赋值的次数,提高了效率
        if(min != i)
        {
            T temp = data[min];
            data[min] = data[i];
            data[i] = temp;
        }
    }
}


int main()
{
    int tempArr[] = {0,4,3,5,6,7,9,8,2,1};
    int arrSize = sizeof(tempArr)/sizeof(tempArr[0]);
    cout << "arrSize=" << arrSize << endl;
    // selectSort test
    // selectSort1(tempArr,arrSize);
    // selectSort2(tempArr,arrSize);
    vector<int> tempVec(tempArr,tempArr+arrSize);// 使用数组初始化vector
    selectSort3(tempVec);
    cout << "===========selectSort tempArr==========" << endl;
    for(int i=0; i<arrSize; i++)
    {
        cout << tempArr[i] << endl;
    }
    cout << "===========selectSort tempVec==========" << endl;
    for(int i=0; i<arrSize; i++)
    {
        cout << tempVec[i] << endl;
    }
    cout << "Hello World!" << endl;
    return 0;
}

三、测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值