【问题标题】:int[] array (sort lowest to highest)int[] 数组(从低到高排序)
【发布时间】:2012-04-05 04:03:50
【问题描述】:

所以我不确定为什么这对我来说变得如此困难,但我需要从高到低和从低到高进行排序。

从高到低我有:

int a, b;
int temp;
int sortTheNumbers = len - 1;

for (a = 0; a < sortTheNumbers; ++a) {
    for (b = 0; b < sortTheNumbers; ++b) {
        if (array[b] < array[b + 1]) {
            temp = array[b];
            array[b] = array[b + 1];
            array[b + 1] = temp;
        }
    }
}

但是,我一辈子都无法让它反向工作(从低到高),我已经考虑了逻辑,它总是为所有值返回 0。 任何帮助表示赞赏!

更大的图景是我有一个有 4 列的 JTable,每列都有数字、名称或日期的条目。我需要能够来回排序。

谢谢!

【问题讨论】:

  • 发布您从低到高尝试过的内容,以及遇到问题的地方。应该只有 1 个字符的变化(你可以猜出是哪个字符)。
  • 排序分开,也许链表可以帮助您存储值并从最高到最低再返回。无需一直对它们进行排序。
  • 您说您这样做是为了对 JTable 进行排序:使用 sorter 比手动重新实现排序算法更容易。

标签: java arrays sorting


【解决方案1】:

你唯一需要做的就是改变排序顺序

if (array[b] < array[b + 1])

if (array[b] > array[b + 1])

尽管正如其他人所指出的,它的效率非常低! :-)

【讨论】:

  • 是的,我认为我所要做的就是切换该符号,但它返回 0 而不是实际值,就好像它正在擦除它们一样。至于错误,似乎不太可能,因为从高到低的代码在其自己的方法中完全相同,使用相同的重置变量。
  • 抱歉,我已经重新检查过了,我收回了关于错误的部分!虽然它仍然是一个超慢的冒泡排序;-)
【解决方案2】:

你永远不会访问数组的最后一个元素。

另外,你应该知道bubble sort 效率很低,你可以使用Arrays.sort()

【讨论】:

  • 他为什么需要“访问”数组的最后一个元素?没有什么可以交换的。但是,他确实将其与倒数第二个元素进行了比较,如果它们出现故障则将它们交换。也许我不明白您的建议,您能否包含一个不适用于他发布的代码的测试输入?
  • 似乎 Arrays.sort 是一种简单的方法,那有什么缺点吗?
【解决方案3】:

除非你认为使用已经可用的排序功能和自动装箱是作弊:

Integer[] arr =
    { 12, 67, 1, 34, 9, 78, 6, 31 };
    Arrays.sort(arr, new Comparator<Integer>()
    {
        @Override
        public int compare(Integer x, Integer y)
        {
            return x - y;
        }
    });

    System.out.println("low to high:" + Arrays.toString(arr));

打印low to high:[1, 6, 9, 12, 31, 34, 67, 78]

如果您需要在比较器中将x-y 更改为y-x,则从高到低

【讨论】:

    【解决方案4】:

    您需要更有效的排序。像归并排序。尝试 www.geekviewpoint.com 并进行排序

    【讨论】:

      【解决方案5】:
        public class sorting {
        public static void main(String arg[])throws Exception{
        int j[]={1,28,3,4,2};   //declaring array with disordered values  
      
        for(int s=0;s<=j.length-1;s++){
        for(int k=0;k<=j.length-2;k++){
               if(j[k]>j[k+1]){   //comparing array values
      
          int temp=0;    
          temp=j[k];     //storing value of array in temp variable 
      
      j[k]=j[k+1];    //swaping values
      j[k+1]=temp;    //now storing temp value in array
      
      
      }    //end if block             
      }  // end inner loop    
      }
      //end outer loop
      
      for(int s=0;s<=j.length-1;s++){
      System.out.println(j[s]);       //retrieving values of array in ascending order 
      
      }   
      
      }
      }
      

      【讨论】:

        【解决方案6】:

        如果您只想对 int 数组进行排序:使用快速排序...这不是很多代码,它是平均 N*lgN 或最坏情况下的 N^2。 要对多个数据进行排序,请使用 Java 比较(如上)或稳定的排序算法

        static void quicksort(int[] a,int l, int r){
            if(r <= l) return;
            int pivot = partition(a,l,r);
        
            //Improvement, sort the smallest part first
            if((pivot-l) < (r-pivot)){
                quicksort(a,l,pivot-1);
                quicksort(a,pivot+1,r);
            }else{
                quicksort(a,pivot+1,r);
                quicksort(a,l,pivot-1);
            }
        }
        
        static int partition(int[] a,int l,int r){
            int i = l-1;
            int j = r;
            int v = a[r];
            while(true){
                while(less(a[++i],v));  //-> until bigger
                while((less(v,a[--j]) && (j != i)));    //-> until smaller and not end
                if(i >= j){
                    break;
                }
                exch(a,i,j);
            }
            exch(a,i,r);
            return i;
        }
        

        【讨论】:

          【解决方案7】:

          对于 Java 8,您只需为 从低到高 编写 一个 字符串 Arrays.sort(arr)

          Arrays.sort(arr, Collections.reverseOrder()) 表示从高到低

          【讨论】:

            【解决方案8】:

            您可以尝试使用冒泡排序:示例如下所示

            int[] numbers = { 4, 7, 20, 2, 56 };
            int temp;
            
            for (int i = 0; i < numbers.length; i++)
            {
                   for(int j = 0; j < numbers.length; j++)
                   {
                            if(numbers[i] > numbers[j + 1])
                            {
                                        temp = numbers [j + 1];
                                        numbers [j + 1]= numbers [i];
                                        numbers [i] = temp;
                            }
                    }
            }
            
            for (int i = 0; i < numbers.length; i++)
            {
                     System.out.println(numbers[i].toString());
            }
            

            【讨论】:

              【解决方案9】:

              让我知道这是否有效:

              public class prog1 {
                  public static void main (String args[]){
                      int a[] = {1,22,5,16,7,9,12,16,18,30};
              
                      for(int b=0; b<=a.length;b++){
                          for(int c=0; c<=a.length-2;c++){
                              if(a[c]>a[c+1]){
              
                                  int temp=0;
                                  temp=a[c];
              
                                  a[c]=a[c+1];
                                  a[c+1]=temp;
                              }
                          }
              
                      }
                      for(int b=0;b<a.length;b++){
                          System.out.println(a[b]);
                      }
                  }
              }
              

              【讨论】:

              • 发帖前没有试一下是否有效吗?即使您在移动设备上(例如),您仍然可以使用像 ideone.com 这样的网站,您可以在其中编写代码并运行它,例如你的答案是this
              • 在这种情况下,您最好将您的答案改写为更多的陈述(例如“此方法有效”等)如果您解释 为什么你做了你所做的事情,你更有可能获得支持。 (同时修复格式 - 一致的缩进等)。
              【解决方案10】:

              在 java8 中你可以这样做:

              temp.stream()
                  .sorted((e1, e2) -> Integer.compare(e2, e1))
                  .forEach(e -> System.out.println(e));  
              

              【讨论】:

                【解决方案11】:

                如果您想应用与您所做的相同的逻辑...不使用 Arrays.sort...那么以下将有所帮助

                int[] intArr = {5, 4, 3, 8, 9, 11, 3, 2, 9, 8, 7, 1, 22, 15, 67, 4, 17, 54};
                    //Low to high
                    for(int j=0; j<intArr.length-1; j++){
                        for(int i=0; i<intArr.length-1; i++){
                            if (intArr[i] > intArr[i+1]){
                                int temp = intArr[i+1];
                                intArr[i+1] = intArr[i];
                                intArr[i] = temp;
                            }
                        }
                    }
                    //High to low
                    for(int j=0; j<intArr.length-1; j++){
                        for(int i=0; i<intArr.length-1; i++){
                            if (intArr[i] < intArr[i+1]){
                                int temp = intArr[i+1];
                                intArr[i+1] = intArr[i];
                                intArr[i] = temp;
                            }
                        }
                    }
                    for(int ars : intArr){
                        System.out.print(ars+",");
                    }
                

                【讨论】: