A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
用oc编的,但是运行了部队,求改错#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    NSMutableArray *array=[NSMutableArray arrayWithObjects:@"2",@"3",@"1", nil];
       //冒泡排序
        for(int i=0;i<array.count-1;i++){
            for(int j=0;j<array.count-i-1;j++){
                if(array[j]>array[j+1]){
                    [array exchangeObjectAtIndex:j withObjectAtIndex:(j+1)];
                 }
                 }
        }
        NSLog(@"%@",array);
        NSLog(@"最小值为%@",array[0]);
    }
    return 0;
}


最佳答案

查看完整内容

因为数组元素是NSString,然而你比较元素之间是用的是比较整数的方法,你换成比较字符串或者是你可以这样添加数组元素@1,@2

8 个回复

倒序浏览
因为数组元素是NSString,然而你比较元素之间是用的是比较整数的方法,你换成比较字符串或者是你可以这样添加数组元素@1,@2
回复 使用道具 举报
package com.itheima;

import java.util.Scanner;//导入Scanner包

public class Test08 {
        public static void main(String[] args) {
                Scanner input=new Scanner(System.in);
                //定义一个长度为5的数组
                int[] add=new int[5];
                //定义for循环输入
                System.out.println("接收键盘输入5个数");
                for(int i=0;i<add.length;i++){
                        //异常处理并且接收键盘输入如果输入非法直接结束程序
                        try{
                        System.out.println("请输入第"+(i+1)+"个数:");
                        add[i]=input.nextInt();
                        }catch(Exception e){
                                System.out.println("您输入的是一个非法的数字,必须为数字和整数,程序结束");
                                return;
                        }
                }
                //冒泡排序测试
                //sort so=new sort();
                //so.maximin(so.bubbling(add));//一条语句搞定,调用冒泡排序返回一个数组引用的同时给maxiin方法传过去
                //选择排序测试
                sort so=new sort();
                so.maximin(so.choice(add));//一条语句搞定,调用选择排序返回一个数组引用的同时给maxiin方法传过去
        }
}
//创建一个排序类  功能有冒泡排序和选择排序
class sort{
        //   冒泡排序     返回值类型为数组类型        形参是数组类型
        int[] bubbling(int[] add){
               
                for(int i=0;i<add.length-1;i++){//数组的长度-1因为只有5个元素,循环4次就可以找出最值了。
                       
                        for(int j=0;j<add.length-1-i;j++){//-1-i是为了让程序更加有效的处理和更快速的处理和避免多余的循环和避免越界也就是空指针异常
                               
                                if(add[j]>add[j+1]){ //把大的值交换到后面
                                        //创建一个中间变量来接收add[j]的值
                                        int temp=add[j];
                                        //把add[j+1]赋值给add[j]
                                        add[j]=add[j+1];
                                        //temp赋值给add[j+1]
                                        add[j+1]=temp;//返回数组add的引用
                                }
                        }
                }
                return add;
        }
        //选择排序
        int[] choice(int[] add){
                for(int i=0;i<add.length-1;i++){//数组的长度-1因为只有5个元素,循环4次就可以找出最值了。
                        for(int j=i+1;j<add.length;j++){
                                if(add[i]>add[j]){//把大的值交换到后面
                                        //创建一个中间变量来接收add[i]的值
                                        int temp=add[i];
                                        //把add[i]赋值给add[j]
                                        add[i]=add[j];
                                        //temp赋值给add[j]
                                        add[j]=temp;
                                }
                }
               
                       
                }
                return add;  //返回数组add的引用
               
        }
       
        //创建一个显示最大值和最小值的方法
        void maximin(int[] add){
                //控制台输出
                System.out.println("最小值为:"+add[0]);
                System.out.println("最大值为:"+add[add.length-1]);
        }
       
}
回复 使用道具 举报
排序干嘛,遍历一遍,比较一下就有结果了,干嘛还得排序,多浪费内存啊~~
回复 使用道具 举报
我觉着 给你思路最好: 先假定数组中的第一个元素为最小值,然后遍历数组,用数组中的其他元素,和min 进行比较,如果 min 大于了 某个元素则  将这两个元素的数值交换,。遍历完毕后,则 min 为数组中的最小值
回复 使用道具 举报
本帖最后由 枕草虫 于 2015-8-17 23:22 编辑

找最小数而已,不用排序吧 ,都排完序了,要是要打印原数组怎么办 , 直接
  1. public int findMin(int[] arr){
  2.                 int minIndex = 0;
  3.                 for(int i = 1; i<arr.length;i++){
  4.                         if(arr[minIndex]>arr[i])
  5.                                 minIndex = i;
  6.                 }
  7.                 return arr[minIndex];
  8.         }
复制代码


回复 使用道具 举报
看了上面的回复,多数是说有更好的办法,说你的办法很绕弯路,浪费内存。其实我觉得你的目的是要从练习中不断反省,不断提升。无关于方法优劣,对于我们新手而言,把自己写的错误代码一个一个纠正,就会产生成就感,就会有源源不断的动力继续下去,才能不断进步。
好了,废话不多说,说回你的代码:
首先你的循环方式写错了:
冒泡法的核心是两层循环,第一层循环从第一个数到倒数第二个数;第二层循环是从第一层循环的索引数后边的一个数开始到最后。每做一次内层循环,就将内层循环的当前数组元素(就是你的代码里的array[i])与外层循环的当前数组元素(array[j])进行比较,如果array[i]>array[j],就交换二者。
这样做完内层和外层所有循环,就排序完毕了。
由上所述 你的下面这两行要改:
for(int j=0;j<array.count-i-1;j++){
                if(array[j]>array[j+1]){ ......}
                                   }
改成for(int j=i+1;j<array.count;j++){
                if(array[i]>array[j]){ ......}
                                   }
这样才是冒泡法的正确循环方式。
另外你的数组元素是NSString对象,字符串比较需要用NSString自带的比较方法(内容较多,不再赘述,可以看下官方文档),而不是单纯用array[j]>array[i]。或者你可以用[array[j] integerValue]来获得字符串里面的整数,再进行整型之间的比较。
综上,正确代码为:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    NSMutableArray *array=[NSMutableArray arrayWithObjects:@"2",@"3",@"1", nil];
       //冒泡排序
        for(int i=0;i<array.count-1;i++)
        {
            for(int j=i+1;j<array.count;j++)
                 {
                    if([array[i] integerValue] >[array[j] integerValue])
                     {
                          [array exchangeObjectAtIndex:j withObjectAtIndex:i];
                     }
                 }
        }
        NSLog(@"%@",array);
        NSLog(@"最小值为%@",array[0]);
    }
    return 0;
}
回复 使用道具 举报
值得好好学习下
回复 使用道具 举报
怎么感觉没必要那么复杂呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马