#include<iostream> usingnamespace std; constint N = 1e6 + 10; int n; int q[N]; voidquick_sort(int q[], int l, int r) { if(l >= r) return;//看边界 int i = l - 1, j = r + 1, x = q[l + r >> 1];//取分界点 while(i < j){//进行迭代 do i ++ ;while(q[i] < x);//左边界中如果小于x,则向后移动 do j -- ;while(q[j] > x);//如果小于y,则向前移动 if(i < j) swap(q[i], q[j]);//互换数据 } quick_sort(q, l ,j);//对左右两端均使用快排 quick_sort(q, j + 1 ,r);//对左右两端均使用快排 } intmain() { scanf("%d", &n); for(int i = 0; i < n; i ++) scanf("%d", &q[i]); quick_sort(q, 0, n - 1); for(int i = 0; i < n; i ++) printf("%d ", q[i]); return0; }
#include<iostream> usingnamespace std; constint N = 1e5 + 10; int a[N], tmp[N];//定义辅助数组 voidmerge_sort(int q[], int l, int r) { if (l >= r) return; int mid = l + r >> 1;//确定分点 merge_sort(q, l, mid), merge_sort(q, mid + 1, r); //递归的求左侧和右侧 int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ]; //如果q[i]比q[j]小,就把q[i]放入tmp中 else tmp[k ++ ] = q[j ++ ]; //如果q[j]比q[i]小,就把q[j]放入tmp中 while (i <= mid) tmp[k ++ ] = q[i ++ ]; //如果左半边没有循环完,就把左半边放入tmp中 while (j <= r) tmp[k ++ ] = q[j ++ ]; //如果右半边没有循环完,就把右半边放入tmp中 for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j]; }
intmain() { int n; scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]); merge_sort(a, 0, n - 1); for (int i = 0; i < n; i ++ ) printf("%d ", a[i]); return0; }
#include<iostream> usingnamespace std; constint N = 100010; int n, m; int q[N]; intmain() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]); while (m -- ) { int x; scanf("%d", &x);
int l = 0, r = n - 1; //二分起始坐标 while (l < r) { int mid = l + r >> 1; if (q[mid] >= x) r = mid; else l = mid + 1; } //如果不存在 if (q[l] != x) cout << "-1 -1" << endl; //寻找右边界 else { cout << l << ' '; int l = 0, r = n - 1; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] <= x) l = mid; else r = mid - 1; } cout << l << endl; } } return0; }