算法 复习自用

这篇博客介绍了两种常见的排序算法——快速排序和归并排序,通过C++代码展示了它们的实现过程。同时,还涉及到了数组的查找操作,以及如何在已排序数组中寻找特定元素的起始和结束位置。此外,文章还涵盖了字符串的相加运算及一些编程技巧,如使用结构体和静态变量简化代码。
摘要由CSDN通过智能技术生成

1.1快排

//1.确定分界点x  q[l] q[(l+r)/2] q[r] 或者随机

//2.调整范围 使得x的左边满足小于等于x,右边大于等于x

//3.递归处理左右两边

\#include<iostream>

\#include<string>

using namespace std;

 

void quick_sort(int q[], int l, int r)

{

​	if (l >= r) return;

​	int x = q[l]; int i = l - 1; int j = r + 1;

​	while (i < j)

​	{

​		do i++; while (q[i] < q[l]);

​		do j--; while (q[j] > q[l]);

​		if (i < j) 

{

​			int temp = q[i];

​			q[i] = q[j];

​			q[j] = temp;

​		}

​		quick_sort(q, l, j);

​		quick_sort(q, j + 1, r);

​	}

}

int main()

{

​	int n; scanf("%d", &n);

​	const int MAX = 1e6 + 10;

​	int q[MAX];

​	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;

}

1.2归并排序

//1.确定分界点 mid

//2.递归排序 left right 

//3.归并 --- 合二为一

\#include<iostream>

using namespace std;

const int N = 1000010;

int n;

int q[N], tmp[N];

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 = l, j =mid + 1;

  while(i <= mid && j <= r)

  {

​    if(q[i] <= q[j])

​    {

​      tmp[k++] = q[i++];

​    }

​    else 

​      tmp[k++] = q[j++];

  }

  while (j <= 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()

{

  scanf("%d",&n);

  for(int i = 0; i < n; i++) scanf("%d",&q[i]);

  merge_sort(q, 0, n-1);

  for(int i = 0; i < n; i++) printf("%d",q[i]);

  return 0;

}
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

如果数组中不存在该元素,则返回 -1 -1。

输入格式

第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式

共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置

如果数组中不存在该元素,则返回 -1 -1。

\#include <iostream>

using namespace std;

const int N = 100010;

int n, m;

int q[N];

int main(){

  scanf("%d%d", &n, &m);

  for(int i = 0; i < n; i++) scanf("%d", &q[i]);

  for(int i = 0; i < m; i++){

​    int a;

​    scanf("%d", &a);  //给定一个数值, 找出他的最左端位置和最右端位置

​    int l = 0, r = n - 1;

​    while(l < r){

​      int mid = l + r >> 1;

​      if(q[mid] >= a) r = mid;

​      else l = mid + 1;

​    }

​    if(q[l] != a) printf("-1 -1\n");  

​    else {

​      printf("%d ", l);

​      l = 0, r = n - 1;

​      while(l < r){

​        int mid = l + r + 1 >> 1;

​        if(q[mid] <= a) l = mid;

​        else r = mid - 1;

​      }

​      printf("%d\n", r);

​    }   

  }  

  return 0;

}
\#include<bits/stdc++.h>

using namespace std;

const int N = 110 ;

char a[N] , b[N] ;

int s[N] ;

int main()

{

  cin >> a + 1 >> b + 1 ;   //下标从一开始输入

  int n = max(strlen(a + 1),strlen(b + 1)) ;   

  reverse(a + 1 , a + 1 + strlen(a + 1)) ;  // 翻转字符a数组

  reverse(b + 1 , b + 1 + strlen(b + 1)) ;  // 翻转字符b数组

  // 从个位开始相加 结果储存到s数组里面

  for(int i = 1 ; i <= n ; i ++)

  {

​    if(a[i] && b[i]) s[i] = a[i] - '0' + b[i] - '0' ; 

​    else if(a[i] && !b[i])  s[i] = a[i] - '0' ;

​    else s[i] = b[i] - '0' ;

  }

  // 模拟逢十进一的过程

  for(int i = 1 ; i <= n ; i ++)

  {

​    int m = s[i] / 10 ;

​    s[i] = s[i] % 10 ;

​    s[i + 1] += m ;

  }

  if(s[n+1]) cout << s[n+1] ;

  for(int i = n ; i >= 1 ; i --) cout << s[i] ;

  return 0;

}

2

2.1遇到7的倍数或者个位为7的数

遇到7的倍数或者个位为7的数则击掌代替次数c

c = n / 7 + (n + 3) / 10 - (n + 63) / 70;

2.2素数

请添加图片描述

请添加图片描述

2.3数组取代复杂分支语句

请添加图片描述

计算xxxxxx星期几

请添加图片描述

请添加图片描述

2.2字符串操作函数

请添加图片描述
请添加图片描述

结果:

请添加图片描述

char arr[100];
memset(arr,'a',10);

请添加图片描述

2.3快排

个位数小的 放在前面

请添加图片描述

2.4结构体char输入

在这里插入图片描述

strcpy(stu.szName,"Tom");//输入结构体char

2.4 静态变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
目的是 找到分数低于score 的最高数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值