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