(C++ (归并排序)二分法插入数据) #include<stdio.h> #include<stdlib.h> #include <vector> #include <iostream> void Compare(std::vector<int>& vec, int b, int start, int end); int main() { std::vector<int> sorted{1,3,5,7,9,11,13,15,17,19,21,23,25,27,29}; Compare(sorted, 29, 0, sorted.size()); for (int i = 0; i < sorted.size(); i++) { std::cout << sorted[i] << std::endl; } return 0; } /* * 函数参数意义: * vec:存放数据(数据必须是有序的,且不能为空,为空的情况需要修改代码) * b:要插入的数据 * start:数据起始位置 * end:数据总长度(这点要注意,它不是下标,想要取下标需要减一) */ void Compare(std::vector<int>& vec, int b, int start, int end) { //获取该段数据的中位数(它不是下标,想要取下标需要减一) int mid = (start + end) / 2; //(mid - 1)<0 防止越界 if ((mid - 1)<0) { vec.insert(vec.begin() , b); return; } //当要插入的数据小于中间值并且起始下标小于终点下标 if (b < vec[mid-1] && (start < (end-1))) { //递归调用 Compare(vec, b, start, mid); } //同上 else if (b > vec[mid-1] && (start < (end-1))) { Compare(vec, b, mid, end); } else { //由于vector的insert是前插,当出现一个比数组里都大的值时,要保证vector不越界,必须使用end进行插入 if (b>vec[end-1]) { vec.insert(vec.end(), b); } else { vec.insert(vec.begin() + mid, b); } } }