黑马程序员技术交流社区

标题: 代码调试,死循环 [打印本页]

作者: 赵喜平    时间: 2013-4-4 10:30
标题: 代码调试,死循环
本帖最后由 赵喜平 于 2013-4-4 11:45 编辑
  1. class Arr {
  2.         public static void main(String args[])
  3.         {
  4.                 int arr[] = { 5, 3, 8, 2, 0, 9, 1, 7 };//35208179,

  5.                 quick(arr, 0, (arr.length-1));
  6.                
  7.                 printArr(arr);
  8. //               
  9.         }
  10.         
  11.         public static void quick(int arr[],int left,int right)
  12.         {
  13.                
  14.                 if(left < right)
  15.                 {
  16.                         
  17.                         int temp = getStart(arr,left,right);                                //此处?
  18.                         quick(arr,left,temp);                                  //此处?
  19.                         quick(arr,temp+1,right);
  20.                 }
  21.         }
  22.         public static int getStart(int arr[],int right,int left)
  23.         {
  24.                 int i = 0,j = 0,temp = 0;
  25.                 int key = 0;
  26.                
  27.                 if(arr == null) { return 0; }
  28.                
  29.                 i = left;
  30.                 j = right;
  31.                 key = arr[left];
  32.                
  33.                 while(i < j)
  34.                 {
  35.                         while(arr[j] > key)
  36.                         {
  37.                                 j--;
  38.                         }
  39.                         
  40.                         swap(arr,j,i);
  41.                         while(arr[i] < key)
  42.                         {
  43.                                 i++;
  44.                         }
  45.                         
  46.                         swap(arr,i,j);
  47.                 }
  48.                
  49.                 return i;
  50.         }
  51.         

  52.         public static void swap(int arr[],int i,int j)
  53.         {
  54.                         int temp = arr[i];
  55.                         arr[i] = arr[j];
  56.                         arr[j] = temp;
  57.         }

  58.         public static void printArr(int arr[]) {
  59.                 for (int i : arr)
  60.                 {
  61.                         System.out.print(i + " ");
  62.                 }
  63.                 System.out.println();
  64.         }
  65. }
复制代码

作者: 邵震    时间: 2013-4-4 10:37
本帖最后由 邵震 于 2013-4-4 10:46 编辑

先占坑在答题

这个是我的报错 下面一串19行错误我没复制

Exception in thread "main" java.lang.StackOverflowError
        at java0404d2.getStart(java0404d2.java:25)             25行       int i = 0,j = 0,temp = 0;
        at java0404d2.quick(java0404d2.java:18)                  18行      int temp = getStart(arr,left,right);  这个是啥意思  给getStart函数赋值吗?
        at java0404d2.quick(java0404d2.java:19)                  19行      quick(arr,left,temp);  这个又是啥意思 给自己赋值?


作者: 张昶    时间: 2013-4-4 10:47
1,public static void quick(int arr[],int left,int right)    //在程序中,这个方法的参数是传进一个数组,数组的第一个数的下标和最后一个数的下标
2,nt temp = getStart(arr,left,right);    //此处应该不需要这个方法了吧!
3,public static int getStart(int arr[],int right,int left)    //而这一句和第2句,是说:把第1句的方法的参数是传进一个数组,数组的最后一个数的下标和第一个数的下标。而这样不是绕了远路了吗?还不如直接把此处中要执行的代码放到第1句中。
作者: 赵喜平    时间: 2013-4-4 10:58
邵震 发表于 2013-4-4 10:37
先占坑在答题

这个是我的报错 下面一串19行错误我没复制

   int temp = getStart(arr,left,right); 此处是把方法getStart()的返回值赋给temp
   quick(arr,left,temp); 使用变量temp,调用quick自身的方法
这个代码是快速排序的一段代码,亲
作者: 赵喜平    时间: 2013-4-4 11:00
张昶 发表于 2013-4-4 10:47
1,public static void quick(int arr[],int left,int right)    //在程序中,这个方法的参数是传进一个数 ...

那就请大侠直接把我的这段代码调试成功

这段代码主要是用来实现快速排序的
作者: 邵震    时间: 2013-4-4 11:09
哦 快速排序啊  
作者: 张昶    时间: 2013-4-4 11:23
我知道,但是你那结果是需要排序吗?如果不是排序,不需要吧!
作者: 栗俊植    时间: 2013-4-4 11:34
观察了半天终于找到你的错误在哪里了! left和right的位置反了!!
作者: tshch1989    时间: 2013-4-4 11:35
亲,你的getStart()方法有问题哦,你没法想i<j是不可能的吗,所以while循环中的东东就没执行到哦,接着返回i就是你的right,  quick(arr,left,temp);  那么此处的temp就是right,递归一下,还是这样子哦,接着就无线循环啦,你可以尝试在getStart()上写一个输出语句验证下哦,亲,希望对你有帮助哦

作者: 赵喜平    时间: 2013-4-4 11:43
栗俊植 发表于 2013-4-4 11:34
观察了半天终于找到你的错误在哪里了!left和right的位置反了!!

:handshake
作者: 张源锋    时间: 2013-4-4 12:07
呵呵,left和right的位置反了,还有如果数组里有重复的数字就会出现arr[i]=arr[j]=key会出现死循环的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2