#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int v=a[i];
int j=i-1;
while(j>=1&&a[j]>v){
a[j+1]=a[j];
j--;
}
a[j+1]=v;
printf("第%d轮插入排序的结果为",i);
for(int k=1;k<=n;k++){
printf(" %d",a[k]);
}
printf("\n");
}
return 0;
}
2、插入排序(两个数组)
复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[15];//原数组
int b[15];//新数组
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int len=0;//新数组的当前长度
for(int i=1;i<=n;i++){
int v=a[i];
int j=len-1;
while(j>=0&&b[j]>v){
b[j+1]=b[j];
j--;
}
b[j+1]=v;
len++;
printf("第%d轮插入排序的结果为",i);
for(int k=0;k<len;k++){
printf(" %d",b[k]);
}
cout<<endl;
}
return 0;
}
3、堆排序
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
void display2(int s){
for(int i=0;i<n;i++){
if(i==n-1){
cout<<a[i]<<endl;
}
else{
cout<<a[i]<<" ";
}
}
}
void display3(int u,int v){
int lar=u;
int left=2*u+1;
int right=2*u+2;
if(left<v&&a[left]>a[lar]){
lar=left;
}
if(right<v&&a[right]>a[lar]){
lar=right;
}
if(lar!=u){
swap(a[u],a[lar]);
display3(lar,v);
}
}
void display1(){
for(int i=n/2-1;i>=0;i--){
display3(i,n);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//构建初始堆
display1();
display2(n);
for(int i=n-1;i>0;i--){
swap(a[0],a[i]);
display3(0,i);
display2(n);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N];
int n;
// 调整以i为根的子树为最大堆(索引从1开始)
void disheap(int i, int n) {
int left = 2 * i; // 左子节点
int right = 2 * i + 1; // 右子节点
int max = i; // 最大值索引
if(i<=n/2){
// 找出i、left、right中的最大值
if (left <= n && a[left] > a[max]) {
max = left;
}
if (right <= n && a[right] > a[max]) {
max = right;
}
// 如果最大值不是i,则交换并继续调整
if (max!= i) {
swap(a[i], a[max]);
disheap(max, n); // 递归调整被交换的子树
}
}
}
// 构建初始最大堆并输出
void BuildHeap(int n) {
int i;
for (int i = n/2; i >= 1; i--) {
disheap(i, n);
}
// 输出初始最大堆
for (int j = 1; j <= n; j++) {
cout<<a[j]<<" ";
}
cout << endl;
}
// 堆排序主函数
void display(int n) {
int i;
BuildHeap(n); // 构建初始最大堆并输出
for (int i = n; i >= 2; i--) {
swap(a[1], a[i]); // 将当前最大值移到末尾
disheap(1, i-1); // 调整剩余元素为最大堆
// 输出当前数组状态
for (int j = 1; j <= n; j++) {
cout<<a[j]<<" ";
}
cout << endl;
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
display(n);
return 0;
}
4、排序(快速排序算法)
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,m;
void QuickSort(int s,int t){
int i=s,j=t;
int tmp=a[(i+j)/2];
while(i<=j){
while(a[j]>tmp)j--;
while(a[i]<tmp)i++;
if(i<=j){
swap(a[i],a[j]);
i++,j--;
}
}
if(s<j)QuickSort(s,j);
if(i<t)QuickSort(i,t);
}
int main(){
cin>>m;
while(m--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
QuickSort(1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n, m;
// 随机选择基准值并分区
int Position(int s, int t) {
// 随机选择一个位置与s交换
srand(time(NULL));
int pos = s + rand() % (t - s + 1);
swap(a[s], a[pos]);
int i = s, j = t;
int tmp = a[s];
while (i < j) {
while (j > i && a[j] > tmp) j--;
a[i] = a[j];
while (i < j && a[i] < tmp) i++;
a[j] = a[i];
}
a[i] = tmp;
return i;
}
// 快速排序主函数
void QuickSort(int s, int t) {
if (s < t) {
int i = Position(s, t);
QuickSort(s, i-1);
QuickSort(i+1, t);
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> m;
for (int j = 1; j <= m; j++) {
cin >> a[j];
}
QuickSort(1, m);
for (int j = 1; j <= m; j++) {
cout << a[j] << " ";
}
cout << endl;
}
return 0;
}
5、幂(东莞2014初赛第3题)
复制代码
#include<bits/stdc++.h>
using namespace std;
int a[50];
int k;
int n;
int main(){
cin>>n;
while(n){
a[k]=n%2;
n=n/2;
k++;
}
k=k-1;
for(int i=k;i>=0;i--){
if(a[i]){
cout<<2<<" "<<i<<"\n";
}
}
return 0;
}
6、朗读比赛(东莞2010第2题)
复制代码
#include<bits/stdc++.h>
using namespace std;
int n,s,t,r;
int main() {
cin>>n;//s是速度,t是朗读时间,r是休息时间
cin>>s>>t>>r;
int a=s*t;
int b=t+r;
int c=n/a;
int d=n%a;
int e=c*b;
if(d>0){
int f=(d+s-1)/s;
e+=f;
}
else{
e-=r;
}
cout<<e<<endl;
return 0;
}
7、归并排序
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int b[N]; // 临时数组,用于合并
int n;
// 合并两个有序子数组
void Merge(int le, int ri, int mid) {
int i = le, j = mid + 1;
int k = le;
// 比较两个子数组的元素,按顺序放入临时数组b
while (i <= mid && j <= ri) {
if (a[i] < a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
}
}
// 处理剩余元素
while (i <= mid) b[k++] = a[i++];
while (j <= ri) b[k++] = a[j++];
// 将临时数组b中的有序元素复制回原数组a
for (int i = le; i <= ri; i++) {
a[i] = b[i];
}
}
// 归并排序主函数
void MergeSort(int le, int ri) {
if (le < ri) {
int mid = (le + ri) / 2;
MergeSort(le, mid); // 递归排序左半部分
MergeSort(mid + 1, ri); // 递归排序右半部分
Merge(le, ri, mid); // 合并两个有序部分
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
MergeSort(1, n);
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
8、统计工龄
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N];
int n,m;
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
a[m]++;
}
for(int i=0;i<=50;i++){
if(a[i]){
cout<<i<<":"<<a[i]<<endl;
}
}
return 0;
}
10、分数线划定
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct node{
int num;
int score;
}a[N];
int n,m;
int cmp(node a,node b){
if(a.score==b.score){
return a.num<b.num;
}
else{
return a.score>b.score;
}
}
int main(){
cin>>n>>m;
int l;
for(int i=1;i<=n;i++){
cin>>a[i].num>>a[i].score;
}
l=m*1.5;
sort(a+1,a+1+n,cmp);
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i].score>=a[l].score){
cnt++;
}
}
cout<<a[l].score<<" "<<cnt<<"\n";
for(int i=1;i<=cnt;i++){
cout<<a[i].num<<" "<<a[i].score<<"\n";
}
return 0;
}
11、基数排序
复制代码
#include <iostream>
using namespace std;
const int N = 105;
struct node {
int len;
int data[N];
};
int a[N];
int n, k = 0;
void map_sort() {
node t[11];
// 初始化所有桶的长度为0
for(int i = 0; i < 10; i++) { // 修正:桶索引应为0-9
t[i].len = 0;
}
int maxn = -1e9;
for(int i = 1; i <= n; i++) {
if(a[i] > maxn) {
maxn = a[i];
}
}
int num = 1;
while(maxn > 0) {
k++;
// 将元素分配到对应的桶中
for(int i = 1; i <= n; i++) {
int d = (a[i] / num) % 10; // 修正:避免变量名冲突
t[d].data[t[d].len++] = a[i];
}
num *= 10;
maxn /= 10;
// 从桶中收集元素
int m = 1;
for(int i = 0; i < 10; i++) { // 修正:桶索引应为0-9
for(int j = 0; j < t[i].len; j++) { // 修正:数组索引从0开始
a[m++] = t[i].data[j];
}
t[i].len = 0; // 清空桶
}
// 输出每一轮的结果
if(k<3){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<"\n";
}
else if(k==3){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
}
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
map_sort();
return 0;
}