• 算法导论--插入排序


    2.1 插入排序

    插入按照非降序排列

    #include<iostream>
    #include<vector>
    
    void insert_sort(std::vector<int> &);
    void print_element(const std::vector<int> &);
    
    
    int main(int argc, char **argv){
        int times, num;
        std::vector<int> vi;
        std::cin >> times;
        while(times){
            std::cin >> num;
            vi.push_back(num);
            --times;
        }
        print_element(vi);
        insert_sort(vi);
        print_element(vi);
        return 0;
    }
    
    
    void print_element(const std::vector<int> &vi){
        for(int i : vi){
            std::cout<<i<<' ';
        }
        std::cout<<std::endl;
    }
    
    void insert_sort(std::vector<int> & vi){
        int key;
        for(int i = 1; i < (int) vi.size(); ++i){
            key = vi[i];
            int k = i - 1;
            for(; k >= 0 && vi[k] > key; --k){
                vi[k + 1] = vi[k];
            }
            vi[k + 1] = key;
        }
    }

    运行结果

    E:codingAlgorithms>"2-1 insert-sort.exe"
    5
    9 8 7 6 5
    9 8 7 6 5
    5 6 7 8 9

    练习:

      2-1-2 重写过程INSERTION-SORT,使之按非非升序(而不是非降序)

    #include<iostream>
    #include<vector>
    
    void insert_sort(std::vector<int> &);
    void print_element(const std::vector<int> &);
    
    
    int main(int argc, char **argv){
        int times, num;
        std::vector<int> vi;
        std::cin >> times;
        while(times){
            std::cin >> num;
            vi.push_back(num);
            --times;
        }
        print_element(vi);
        insert_sort(vi);
        print_element(vi);
        return 0;
    }
    
    
    void print_element(const std::vector<int> &vi){
        for(int i : vi){
            std::cout<<i<<' ';
        }
        std::cout<<std::endl;
    }
    
    void insert_sort(std::vector<int> & vi){
        int key;
        for(int i = 1; i < (int) vi.size(); ++i){
            key = vi[i];
            int k = i - 1;
            for(; k >= 0 && vi[k] < key; --k){
                vi[k + 1] = vi[k];
            }
            vi[k + 1] = key;
        }
    }
    
    输出结果:
    E:codingAlgorithms>"2-1 insert-sort.exe"
    5
    1 2 3 4 5
    1 2 3 4 5
    5 4 3 2 1

    2-1-3 考虑以下查找问题:

      输入:n个数的一个序列A={a1, a2, ... , an}和一个之v。

      输出:下标i使得v=A[i]或者当v不在A中出现时,v位特殊值NIL。

       写出线性查找的伪代码, 他扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的,。确保你的循环不变式满足三条必要的性质。

    #include<iostream>
    #include<vector>
    
    #define NIL -1
    
    template<typename T>
    void print_element(const T &);
    
    template<typename T, typename L>
    int find_val(const T&, const L &);
    
    int main(int argc, char **argv){
        std::vector<int> vi;
        int times, num;
        std::cin >> times;
        while(times){
            std::cin >> num;
            vi.push_back(num);
            --times;
        }
        print_element(vi);
        int index = find_val(vi, 4);
        std::cout << index << std::endl;
        return 0;
    
    }
    
    template<typename T>
    void print_element(const T &coll){
        for(typename T::const_iterator pos = coll.begin(); pos != coll.end(); ++pos){
            std::cout << *pos << " ";
        }
        std::cout << std::endl;
    }
    
    template<typename T, typename L>
    int find_val(const T &coll, const L &val){
        for(int i = 0; i < (int)coll.size(); ++i){
            if(val == coll[i]) return i;
        }
        return NIL;
    }
    
    
    输出结果:
    E:codingAlgorithms>2-1-3.exe
    5
    1 2 3 4 5
    1 2 3 4 5
    3
  • 相关阅读:
    python 编码问题
    关于网页划词翻译
    clang 编译 c++
    Java流(Stream)操作实例筛选、映射、查找匹配
    JAVA系列笔记十八之nohup实现后台运行程序
    VSCode汇总
    java jdk 国内下载镜像地址及安装
    LocalDate、LocalDateTime与timestamp、Date的转换
    List.sort()排序功能
    Java Array、List、Set互相转化
  • 原文地址:https://www.cnblogs.com/hebust-fengyu/p/10467782.html
Copyright © 2020-2023  润新知