冒泡排序、选择排序

一、冒泡排序
算法思想:
从左到右扫描数据,找出最大的元素,将其放到数组右边,循环比较相邻的两个数,如果左边的数比右边的大,则交换两个数;

template <typename Type>  
void bubbleSort(Type *begin, Type *end)  
{  
    if ((begin == end) || (begin == NULL) || (end == NULL))  
        return ;  

    int length = end - begin;  
    //注意点(1):保证一旦数组有序, 则会直接停止排序, 不会在继续进行无用的循环  
    bool isOrder = false;  

    //外层循环控制扫描次数(length-1)  
    //注意点(2):N个元素其实只需N-1次扫描  
    for (int i = 0; !isOrder && i < length-1; ++i)  
    {  
        //首先假定这次数组已经有序  
        isOrder = true;  
        //注意点(3):确保能够从0扫描到最后一个未排序的元素  
        for (Type *iter = begin; iter < end-i-1; ++iter)  
        {  
            //如果前面的左边的元素>右边的元素  
            if (*iter > *(iter+1))  
            {  
                //交换  
                std::swap(*iter, *(iter+1));  
                isOrder = false;  
            }  
        }  
    }  
}  

template <typename Type>  
void bubbleSort(Type *array, int length)  
{  
    return bubbleSort(array, array+length);  
}  

二、选择排序
思想:从当前尚未排序的序列中选择一个最小的元素,将之放到已排序的序列的队列的末尾;

template <typename Type>  
void selectSort(Type *begin, Type *end)  
{  
    if ((begin == end) || (begin == NULL) || (end == NULL))  
        return ;  

    //只要循环到最后一个元素的前一个就行了,因为剩下的那个肯定是最大的  
    for (Type *outer = begin; outer < end-1; ++outer)  
    {  
        //注意:是从尚未排序的序列中查找(miner = outer, inner = outer+1)  
        Type *miner = outer;  
        //从miner+1开始遍历数组, 寻找一个元素值小于*miner的  
        for (Type *inner = outer+1; inner < end; ++inner)  
        {  
            if (*inner < *miner)  
                miner = inner;  
        }  

        if (miner != outer)  
            std::swap(*miner, *outer);  
    }  
}  

//为了能够让STL的标准容器如vector使用  
template <typename Iterator>  
void selectSort(Iterator iter1, Iterator iter2)  
{  
    return selectSort(&(*iter1), &(*iter2));  
}  

template <typename Type>  
void selectSort(Type *array, int length)  
{  
    return selectSort(array, array+length);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值