啊!啊!啊!啊!啊!!!
太久没有写代码了
虽热很久没有写代码和博客了,但是功底还是在的
今天打算写一点数据结构的排序部分一点一点落实下来,但是
写着写着卡壳了,以下是没有debug的代码
#include <iostream>
#include<bits/stdc++.h>using namespace std;
vector<int> a;int check(int l, int r, int x) {while (l < r) {int mid = (l + r + 1) >> 1;if (a[mid] > x) {r = mid - 1;} else {l = mid;}}return r;
}void mid_insert_sort() {for (int i = 1; i < a.size(); i++) {int x = check(0, i, a[i]);cout << x << ' ' << i << endl;for (int j = i; j > x; j--) {swap(a[j], a[j - 1]);}for (int j = 0; j < a.size(); j++) {cout << a[j] << ' ';}cout << endl;}
}int main() {int n;cin >> n;while (n--) {int x;cin >> x;a.push_back(x);}mid_insert_sort();for (int i: a)cout << i << ' ';
}
反正二分和折半插入的思想没有错
然后开始慢慢检查二分check函数的错误
1.check函数用的bool函数写的
然后返回值都是01,,,,,
以后尽量不用bool类型了,妈的
找完了之后
debug好久硬是没有错误
然后挑了一个例子debug发现每一次
10
49 59 88 37 98 97 68 54 31 31 1
49 59 88 37 98 97 68 54 31 3
2 2
49 59 88 37 98 97 68 54 31 3
0 3
37 49 59 88 98 97 68 54 31 3
4 4
37 49 59 88 98 97 68 54 31 3
3 5
37 49 59 97 88 98 68 54 31 3
2 6
37 49 68 59 97 88 98 54 31 3
1 7
37 54 49 68 59 97 88 98 31 3
0 8
31 37 54 49 68 59 97 88 98 3
0 9
3 31 37 54 49 68 59 97 88 98
3 31 37 54 49 68 59 97 88 98
发现了一个问题
当x大于当前队伍的所有值时,还是会交换x
然后我就特判了一下,发现还是错误,于是我就单独的把check函数拉出来检查一下,发现一个大问题,二分的范围是有限的
就比如这题: 1-5,我的check函数是找到小于等于x的最大值
我发现如果所有值都小于x那么函数return就会返回1
但是这是错误的
然会我就发现,,,,,二分是在当前的范围内进行查找,,,,
但是插入在范围中会比原来的范围多两个边界值
所以,,,,,加上a[0]就可以了,,,,,
#include <iostream>
#include<bits/stdc++.h>using namespace std;
const int N = 1e5 + 100;
int a[N];
int n;int check(int l, int r, int x) {while (l < r) {int mid = (l + r + 1) >> 1;if (a[mid] > x) {r = mid - 1;} else {l = mid;}}return r;
}void mid_insert_sort() {for (int i = 1; i <= n; i++) {int x = check(0, i, a[i]);int idx = i;for (int j = i; j - 1 > x; --j) {swap(a[j], a[j - 1]);}}}int main() {a[0] = INT32_MAX;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}mid_insert_sort();for (int i = 1; i <= n; i++)cout << a[i] << ' ';
}
~~大意了,,,,这么个简单的代码和思想
,,,,之前一直以为哨兵是没有用的
主要是之前的习惯比较好,会特意注意边界问题,一般不会越界,
但是这个插入的会在边界值多出,,,,所以没有想到~~