二维数组对名字实现冒泡排序,只有三个名字排对了顺序

22222后面是经过冒泡排序输出的,为什们有的是正确的,有的不正确?
帮我改一下吧谢谢


#include<iostream>
#include<cstring>
#include<cstring>
using namespace std; 
void sortName(char (*a)[10]){
    char t[6][10];
    int i,j;
for(i=0;i<5;i++)
for(j=0;j<5-i;j++){
    if(strcmp(a[j],a[j+1])) {strcpy(t[j],a[j]);strcpy(a[j],a[j+1]);strcpy(a[j+1],t[j]);}
}     
    cout<<"22222"<<endl;
    for(i=0;i<6;i++)
    cout<<a[i]<<endl;
}
void print(char a[6][10]){
    int i; 
    for(i=0;i<6;i++)
    cout<<a[i]<<endl;//把二维数组看作特殊的一维数组,每一行相当于一维数组的一个元素 
}
int main(){
    char m[6][10]={"Tom","Mary","Jack","Rose","Harry","Alice"};
    cout<<"11111"<<endl;
    print(m);
    sortName(m);
    cout<<"33333"<<endl;
    print(m);
}

img

效果如下 :

img

修改代码如下 :

#include <iostream>
#include <cstring>
using namespace std;

void sortName(char (*a)[10]) {
    char t[10];
    int i, j;
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5 - i; j++) {
            if (strcmp(a[j], a[j + 1]) > 0) {
                strcpy(t, a[j]);
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], t);
            }
        }
}

void print(char a[][10]) {
    for (int i = 0; i < 6; i++)
        cout << a[i] << endl;
}

int main() {
    char m[6][10] = { "Tom", "Mary", "Jack", "Rose", "Harry", "Alice" };
    cout << "11111" << endl;
    print(m);
    sortName(m);
    cout << "33333" << endl;
    print(m);
    return 0;
}


原因: 冒泡排序出错的原因在于你在比较字符串时使用了strcmp函数,这个东西返回的结果是两个字符串的大小关系而不是布尔值 , 理解了不 , 如有帮助给个 大大的采纳 加关注 , 不行的话给我的置顶博客 评论几下去 . 谢谢谢

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/24171
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:设一个仅包含运算二元算术表达式,以链表二叉树存储,写出计算该表达式的算法
  • 除此之外, 这篇博客: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。中的 题目 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    矩阵如下:
    1 2 8 9
    2 4 9 12
    4 7 10 3
    6 8 11 15

    解题思路

    找规律
    从右上角或者左下角找规律。
    如果 查找的值大于右上角的值,向下搜索
    如果 查找的值小于右上角的值,向左搜索
    直到 等于右上角的值

    二分法
    因为每行有序
    按每一行或每一列进行二分查找

    代码实现
    找规律

    public class Solution {
          public boolean Find(int target, int [][] array) {
            if (array == null) {
                return false;
            }
             //行长
            int rLength = array.length;
            
            if(rLength == 0) {
                return false;
            }
            //列长
            int cLength = array[0].length;
            if(cLength == 0) {
                return false;
            }
            //如果大于右下角的,返回
            if (array[rLength-1][cLength-1] < target){
                return false;
            }
            if (array[0][0] > target) {
                 return false;
            }        
            //右上角节点的起始行数
            int node = 0;
            //从右上角开始,从右向左遍历列
            for (int i = cLength-1; i >= 0 ; i--) {
                //如果等于右上角的,返回
                if (array[node][i] == target){
                    return true;
                }
                //值大于右上角,向下查找
                if (target > array[node][i]) {
                    for (int j = node ; j < rLength ; j++) {
                        //找到
                        if (array[j][i] == target){
                            return true;
                        }
                        //节点下移
                        node++;
                        if (target < array[j][i]) break;
                    }
                }
                //值小于右上角的,顶点左移,向左继续搜素
            }
            return false;
        }
    }
    

    按列二分

    public static boolean find(int[] a ,int left,int right,int target){
            int mid = (left + right)/2;
    
            if (target == a[mid]||target == a[left]||target == a[right]) return true;
    
            if (left == right) return false;
    
            if (target < a[mid]) {
                find(a,++left,--mid,target);
            }
            if (target > a[mid]){
                find(a,++mid,--right,target);
            }
            return false;
    }
    public static boolean Find2(int target, int[][] array) {
            if (array == null) {
                return false;
            }
            if(array.length == 0) {
                return false;
            }
            //列长
            if(array[0].length == 0) {
                return false;
            }
            //如果大于右下角的,返回
            if (array[array.length-1][array[0].length-1] < target){
                return false;
            }
            if (array[0][0] > target) {
                return false;
            }
            for (int i = 0; i < array.length-1 ; i++) {
                if(find(array[i],0,array[i].length-1,target)){
                    return true;
                }
            }
            return false;
    }
    
  • 您还可以看一下 黄菊华老师的2021 公开课、选修课报名抢座小程序 毕业设计 毕设 源码 源代码使课程中的 选修课报名小程序-后台系统如何发布小节, 巩固相关知识点