算法导论--插入排序

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:\coding\Algorithms>"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:\coding\Algorithms>"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:\coding\Algorithms>2-1-3.exe
5
1 2 3 4 5
1 2 3 4 5
3

猜你喜欢

转载自www.cnblogs.com/fengyucoding/p/10467782.html
今日推荐