链表+排序

template <typename Type>


class Node{
        
    

private:
    Node(Type &dataValue):data(dataValue),next(nullptr){}
    Node(){}

    Type data;
        Node* next;
}

class MyList{
    MyList();
    ~MyList();

    void insertFront(Type &data);        //在首位置插入元素
    void remove(int index);                //删掉第几个元素
    void remove(Type &data);               //删掉所有值是data的元素
    void insert(const Type&data,int index);         //在第几个位置前插入元素

    bool isEmpty();
    
    void sort();                         //有多种排序,比如冒泡 选择 插入 快速
    void concatenate(MyList<Type>& myList );
    
private:
    Node<Type>* first;
};
MyList(){
    first=new Node<Type>();
    first->next=nullptr;
    }
~MyList(){
    while(first){                           //从第一个元素逐个往后删
        Node<Type>* deleteNode=first;
        first=first->next;
        delete deleteNode;
    }

}

void insertFront(Type &data){
    Node<Type>* newNode=new Node<>(data);
    newNode->next=first->next;
    first->next=newNode;
    
}
void remove(int index){
    if(isEmpty())
        return;
    int i=0;
    removeNode=first;
    while(i!=index-1){
        removeNode=removeNode->next;
        i++;
    }
    delete removeNode;
}
void remove(Type &data){
    if(isEmpty())
        return;
    deleteNode=first;
    while(deleteNode->data!=data){
        deleteNode=deleteNode->next;
    
    }
    delete deleteNode;

    
    
}
void insert(const Type&data,int index){


}

bool isEmpty();
    //冒泡
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 ((Type *)*iter->data > (Type*)*(iter+1)->data)  
            {  
                //交换  
                std::swap(*iter, *(iter+1));  
                isOrder = false;  
            }  
        }  
    }  
}  
//选择排序, 选择一个比要比较的那个小的,交换
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);  
    }  
}  

//实现:迭代二分  
template <typename Type>  
Type *binarySearch(Type *begin, Type *end, const Type &searchValue)  
throw(std::range_error)  
{  
    if ((begin == end) || (begin == NULL) || (end == NULL))  
        throw std::range_error("pointer unavailable");  
    Type *low = begin, *high = end-1;  
    while (low <= high)  
    {  
        //计算中间元素  
        Type *mid = low + (high-low)/2;  
        //如果中间元素的值==要找的数值, 则直接返回  
        if (*mid == searchValue)  
            return mid;  
        //如果要找的数比中间元素大, 则在数组的后半部分查找  
        else if (searchValue > *mid)  
            low = mid + 1;  
        //如果要找的数比中间元素小, 则在数组的前半部分查找  
        else  
            high = mid - 1;  
    }  
 
    return end;  
}
template <typename Type>  
Type *binarySearch(Type *array, int length, const Type &searchValue)  
throw(std::range_error)  
{  
    return binarySearch(array, array+length, searchValue);  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值