黑马程序员技术交流社区

标题: 栈排序 [打印本页]

作者: 杨道红    时间: 2013-12-19 21:46
标题: 栈排序
本帖最后由 杨道红 于 2013-12-20 10:46 编辑

/*栈排序
* 对数组排序
* 先记录下标,却不置换位置。每一回合结束调换一次位置
*/
public class zijia {
        public static void main(String[] args){
                int[] arr = {7,3,5,4,6,9,2};
                printArr(arr);
                zhanpaixu(arr);
                printArr(arr);
        }
        public static void zhanpaixu(int[] arr){
                for(int i = 0; i<arr.length-1 ; i++){
                        int temp=0;
                        
                        for(int j = 0; j<arr.length-i; j++){
                                if(arr[temp]<arr[j+1]){
                                        temp= j+1;
                                }
                        }
                        while(temp!=arr.length-1){
                                int Arrtemp=arr[temp];
                                arr[temp]=arr[arr.length-i-1];
                                arr[arr.length-i-1]=Arrtemp;
                        }
                }
        }
        public static void printArr(int[] arr){
                for(int i = 0; i<arr.length ;i++){
                        System.out.print(arr);
                }
        }
}
代码有点问题。大神指点一二。

作者: 月生春    时间: 2013-12-19 22:24
本帖最后由 月生春 于 2013-12-19 22:26 编辑

public class zijia {
        public static void main(String[] args){
                int[] arr = {7,3,5,4,6,9,2};
                printArr(arr);
                zhanpaixu(arr);
                printArr(arr);
        }
        public static void zhanpaixu(int[] arr){
                for(int i = 0; i<arr.length-1 ; i++){
                        int temp=0;
                        
                        for(int j = 0; j<arr.length-i; j++){
                                if(arr[temp]<arr[j+1]){         
                                        temp= j+1;                     
                                }                                                
                        while(temp!=arr.length-1){
                                int Arrtemp=arr[temp];
                                arr[temp]=arr[arr.length-i-1];
                                arr[arr.length-i-1]=Arrtemp;
                        }
                }
        }
        public static void printArr(int[] arr){
                for(int i = 0; i<arr.length ;i++){
                        System.out.print(arr);
                }
        }
}

if(arr[temp]<arr[j+1]){          这里错了,第一次循环 得到的比较是 arr【0】和arr【1】比较,过后 temp=1 再循环 是arr【2】
       和arr【2】比较,所以错了 ,应改为 for(int j=i;j<arr.length-1;j++)便没问题了。你这代码可以
  很大的优化,可以看看毕老师的那几个排序方法!

作者: 张利星    时间: 2013-12-19 22:26
while循环的循环条件应该是temp!=arr.length-1-i,你少写了个i吧,
作者: 刘松703    时间: 2013-12-19 22:26
本帖最后由 刘松703 于 2013-12-20 00:06 编辑

  1. <P>public class Demo2 {

  2.                 public static void main(String[] args) {
  3.                                        int[] arr = { 3, 5, 6, 2, 8, 4, 9 };
  4.                                        order(arr);
  5.                 }

  6.               public static void order(int[] arr) {
  7.                                      for (int i = 0; i < arr.length - 1; i++) {
  8.                                                    int temp = 0;
  9.                                                for (int j = 0; j < arr.length - i - 1; j++) {
  10.                                                                if (arr[temp] < arr[j + 1]) {
  11.                                                                         temp = j + 1;
  12.                                                                }
  13.                                                 }
  14.                                               if (temp != arr.length - 1 - i) {
  15.                                                                int Arrtemp = arr[temp];
  16.                                                                arr[temp] = arr[arr.length - i - 1];
  17.                                                               arr[arr.length - i - 1] = Arrtemp;
  18.                                               }
  19.                                    }
  20.   
  21.                                   for (int i = 0; i < arr.length; i++) {
  22.                                               System.out.print(arr[i]);
  23.                                  }
  24.               }
  25. }
复制代码

路给你修改了,自己比较一下把,主要是条件错了。

作者: 张利星    时间: 2013-12-19 23:07
我说说我理解的意思啊,就是在第i轮比较中,找出数组当中的最大值放到每轮比较最后的位置即arr[arr.length-1-i].
如果我没理解错你的意思的话,你的程序有几个地方需要改:
1、for嵌套循环的内层循环存在数组角标越界异常,可做如下修改
  1. for(int j = 1; j<arr.length-i; j++){
  2.                             if(arr[temp]<arr[j]){
  3.                                     temp= j;
  4.                             }
复制代码

2、while语句改为if,因为这里是做判断,不需要循环,判断条件temp!=arr.length-1-i,你的少减一个i
  1. public class zijia {
  2.     public static void main(String[] args){
  3.             int[] arr = {7,3,5,4,6,9,2};
  4.             printArr(arr);
  5.             zhanpaixu(arr);
  6.             printArr(arr);
  7.     }
  8.     public static void zhanpaixu(int[] arr){
  9.             for(int i = 0; i<arr.length-1 ; i++){
  10.                     int temp=0;
  11.                     
  12.                     for(int j = 1; j<arr.length-i; j++){
  13.                             if(arr[temp]<arr[j]){
  14.                                     temp= j;
  15.                             }              
  16.                     }
  17.                     if(temp!=arr.length-1-i){
  18.                             int Arrtemp=arr[temp];
  19.                             arr[temp]=arr[arr.length-i-1];
  20.                             arr[arr.length-i-1]=Arrtemp;
  21.                     }
  22.             }
  23.     }
  24.     public static void printArr(int[] arr){
  25.             for(int i = 0; i<arr.length ;i++){
  26.                     System.out.print(arr[i]);
  27.             }
  28.     }
  29. }
复制代码

作者: 杨道红    时间: 2013-12-20 10:45
张利星 发表于 2013-12-19 23:07
我说说我理解的意思啊,就是在第i轮比较中,找出数组当中的最大值放到每轮比较最后的位置即arr[arr.length- ...

这是我以前写的,当时没注意。你说的2问题我昨晚都发现了。还是谢谢你
作者: 杨道红    时间: 2013-12-20 10:50
本帖最后由 杨道红 于 2013-12-20 11:19 编辑
月生春 发表于 2013-12-19 22:24
public class zijia {
        public static void main(String[] args){
                int[] arr = {7, ...

谢谢,新人求罩啊。刚调试了一下,你那样改得不到要的结果。
如果改成了j=i;就不会每次都从第一个开始比较。
我改成了for(int j = 1; j<arr.length-i; j++){
                                if(arr[temp]<arr[j]){
                                        temp= j;
                                }





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