1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=50;
  4. void getnext(char str[]){
  5. int l=strlen(str),i,j,k,temp;
  6. k=l-2;
  7. while(k>=0&&str[k]>str[k+1])k--;
  8. i=k+1;
  9. while(i<l&&str[i]>str[k])i++;
  10. temp=str[k];
  11. str[k]=str[i-1];
  12. str[i-1]=temp;
  13. for(i=l-1;i>k;i--){
  14. for(j=k+1;j<i;j++){
  15. if(str[j]>str[j+1]){
  16. temp=str[j];
  17. str[j]=str[j+1];
  18. str[j+1]=temp;
  19. }
  20. }
  21. }
  22. }
  23. int main(){
  24. char a[maxn];
  25. int n;
  26. cin>>a>>n;
  27. while(n>0){
  28. getnext(a);
  29. n--;
  30. }
  31. cout<<a<<endl;
  32. return 0;
  33. }

回文串

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool is_palindrome(string s){
  4. int len=s.size();
  5. bool flag=true;
  6. for(int i=0;i<len/2;i++){
  7. if(s[i]!=s[(len-1)-i]){
  8. flag=false;
  9. }
  10. }
  11. return flag;
  12. }
  13. int main(){
  14. string s2;
  15. cout<<is_palindrome(s2);
  16. return 0;
  17. }

第一个出现一次的字符

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int arr[256];
  4. int main(){
  5. string s;
  6. cin>>s;
  7. int len=s.size();
  8. for(int i=0;i<256;i++){
  9. arr[i]=0;
  10. }
  11. for(int i=0;i<len;i++){
  12. arr[s[i]]++;
  13. }
  14. for(int i=0;i<len;i++){
  15. if(arr[s[i]]==1){
  16. cout<<s[i];
  17. return 0;
  18. }
  19. }
  20. cout<<"no";
  21. return 0;
  22. }

给定两个有序数列,合并成一个新的升序数列//归并排序的归并

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const SIZE=100;
  4. int arr[SIZE];
  5. int brr[SIZE];
  6. int main(){
  7. int na,nb;
  8. cin>>na>>nb;
  9. for(int i=1;i<=na;i++){
  10. cin>>arr[i];
  11. }
  12. for(int i=1;i<=nb;i++){
  13. cin>>brr[i];
  14. }
  15. int i,j;
  16. i=1;
  17. j=1;
  18. while(i<=na&&j<=nb){
  19. if(arr[i]<brr[j]){
  20. cout<<arr[i];
  21. i++;
  22. }else{
  23. cout<<brr[j];
  24. j++;
  25. }
  26. }
  27. if(i<=na){
  28. for(num=i;num<=na;num++){
  29. cout<<arr[i];
  30. }
  31. }
  32. if(i<=nb){
  33. for(num=i;num<=nb;num++){
  34. cout<<brr[i];
  35. }
  36. }
  37. return 0;
  38. }

翻转数组

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[6];
  4. int main(){
  5. left=0;
  6. right=5;
  7. while(left<right){
  8. swap(a[left],a[right]);
  9. left++;
  10. right--;
  11. }
  12. for(int i=0;i<5;i++){
  13. cout<<a[i];
  14. }
  15. return 0;
  16. }
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int arr[9] = {0,11,22,66,77,33,55,44,88};
  4. int brr[9] ;
  5. void merge(int l , int mid , int r){
  6. // 合并为有序数列
  7. int i = l ;
  8. int k = l ;
  9. int j = mid + 1;
  10. // 从左右两边依次判断较小值进行合并
  11. while(i <= mid && j <= r){
  12. if(arr[i] < arr[j]){
  13. brr[k++] = arr[i++];
  14. }else{
  15. brr[k++] = arr[j++];
  16. }
  17. }
  18. while(i<=mid){
  19. brr[k++] = arr[i++];
  20. }
  21. while(j<=r){
  22. brr[k++] = arr[j++];
  23. }
  24. for(int i = l ;i <=r;i++){
  25. arr[i] = brr[i];
  26. }
  27. }
  28. void mergeSort(int l ,int r){
  29. // 分解原数组
  30. if(l >= r) return ;
  31. // 计算中间值
  32. int mid = (l+r)/2;
  33. mergeSort(l,mid); // 左数列 11,22,66,77
  34. mergeSort(mid+1,r); // 右数列 33,55,44,88
  35. //... 合并
  36. merge(l,mid,r);
  37. }
  38. int main(){
  39. mergeSort(1,8);
  40. for(auto x : arr) cout << x << " ";
  41. return 0;
  42. }
归并排序
1. 算法介绍
归并排序是一种高效的 分治法(Divide and Conquer) 排序算法,核心思想:
1️⃣ 分解:将数组递归拆分为最小单位(单个元素)
2️⃣ 合并:将有序子数组合并为更大有序数组
✅ 时间复杂度:最优/平均/最坏均为 O(n log n)
✅ 稳定性:稳定排序(相同元素顺序不变)
✅ 适用场景:大数据量、链表排序、外部排序
2. 分治思想图解
  1. 初始数组: [38, 27, 43, 3, 9, 82, 10]
  2. 分解
  3. [38, 27, 43] [3, 9, 82, 10]
  4. 分解 分解
  5. [38] [27, 43] [3,9] [82,10]
  6. 合并 合并
  7. [27, 38, 43] [3,9,10,82]
  8. 合并
  9. [3,9,10,27,38,43,82]
3. 合并操作详解

核心步骤:合并两个有序数组

  1. Left数组: [27, 38, 43] Right数组: [3, 9, 10, 82]
  2. Step1: 比较左首(27) vs 右首(3) 取较小值 3
  3. Step2: 比较 27 vs 9 9
  4. Step3: 比较 27 vs 10 10
  5. Step4: 直接追加左数组:[27,38,43]
  6. 结果:[3, 9, 10, 27, 38, 43, 82]
4. 关键点分析
🔹 递归深度:共 log₂n 层分解
🔹 合并成本:每层合并需 O(n) 操作
🔹 空间复杂度:O(n)(临时数组开销)
🔹 优化策略:
小数组用插入排序减少递归开销
避免频繁内存分配(全局复用 temp 数组)
5. 与快速排序对比
  1. 特性 归并排序 快速排序
  2. 最坏时间复杂度 O(n log n) O(n²)
  3. 稳定性 稳定 不稳定
  4. 空间复杂度 O(n) O(log n) 栈空间
  5. 适用场景 大数据量/外部排序 内存排序/随机数据
6. 可视化演示推荐
🔗 归并排序动画演示
(动态理解分解与合并过程)
总结:归并排序以 时间换空间,凭借稳定且可预测的性能,成为大规模数据排序的基石算法!