#include<iostream>
using namespace std;
const int N=1000010;
int q[N];
void quick_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<l)
{
do i++;while(q[i]<x);
do j--;while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
int n;
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]);
return 0;
}
归并排序
归并排序思想——分治
确定分界点 mid=(l+r)/2
递归排序左右两边
归并——合二为一
#include<iostream>
using namespace std;
const int N = 1000010;
int a[N], tmp[N];//a是待排序数组,tmp是辅助数组
void merge_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 = 1, j = mid + 1;
while (i <= mid && j <= r)
{
if (q[i] <= q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
}
while (i <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for (i = l, j = 0;i <= r;i++, j++) q[i] = tmp[j];//将辅助数组的值复制到输出数组里
}
int main()
{
int n;
scanf_s("%d", &n);//数组n的长度
for (int i = 0;i < n;i++) scanf_s("%d", &a[i]);//读入
merge_sort(a, 0, n - 1);//排序
for (int i = 0;i < n;i++) printf("%d", a[i]);//输出
return 0;
}
二分——整数二分(容易出现边界问题)
二分的本质——寻找不同性质的边界
二分的思想
#include<iostream>
using namespace std;
const int N = 1000010;
int n, m;
int q[N];
int main()
{
scanf_s("%d%d", &n, &m);
for (int i = 0;i < n;i++) scanf_s("%d", &q[i]);
while (m--)
{
int x;
scanf_s("%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;
}
}
return 0;
}