数组int[]排序(从小到大)

9

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

按从高到低排序:

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。感谢任何帮助!
更大的问题是,我有一个JTable,其中有4列,每一列都有数字、名称或日期的条目。我需要能够来回排序。
谢谢!

请发布您尝试过的代码,从低到高,并说明遇到了什么问题。只需要更改一个字符(您可以猜测是哪个字符)。 - Mark Peters
排序的话,也许使用链表可以帮助你存储值并从高到低遍历它们,而无需一直进行排序。 - vulkanino
2
你说你正在对JTable进行排序:使用排序器比手动重新实现排序算法更容易。 - assylias
11个回答

22

除非你认为使用已有的排序函数和自动装箱是作弊:

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
你永远不会访问数组的最后一个元素。
此外,你应该知道冒泡排序非常低效,你可以使用Arrays.sort()

他为什么需要“访问”数组的最后一个元素?没有任何东西可以与之交换。但是,他会将其与倒数第二个元素进行比较,并在它们的顺序不正确时进行交换。也许我没有理解你的建议,你能否提供一个测试输入,以证明他发布的代码无法正常工作? - Mark Peters
Arrays.sort似乎很容易,但它有什么缺点吗? - Renjith K N
完美的答案,节省了很多代码。 - A.I.Shakil

3
  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 

}   

}
}

2

对于Java 8,你只需编写一个字符串Arrays.sort(arr)来实现从低到高的排序。

Arrays.sort(arr, Collections.reverseOrder())可实现从高到低的排序。


1
在Java8中,您可以像这样做:

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

1

要改变排序顺序的唯一事情就是改变

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

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

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

是的,我想出来我所要做的就是切换那个符号,但它返回的是0而不是实际值,好像它正在擦除它们。至于 bug,似乎不太可能,因为高到低的代码在其自己的方法中完全相同,使用相同的重置变量。 - Austin
抱歉,我重新检查了一下,撤回了关于错误的部分!但它仍然是一个超级慢的冒泡排序;-) - dty

0

如果您想使用与您所做的相同的逻辑,而不使用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+",");
    }

0
你需要一个更高效的排序算法,比如归并排序。试试去 www.geekviewpoint.com 并找到“sort”部分。

0

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

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;
}

-2

请告诉我这是否有效:

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]);
        }
    }
}

1
你在发布前没有试过它是否有效吗?即使您使用移动设备,仍然可以使用像ideone.com这样的网站,您可以编写代码并运行它,例如,您的答案是这个 - Wai Ha Lee
在这种情况下,你最好重新措辞你的回答,使其更像是一个陈述(例如“这个方法可行”等)。如果你解释清楚了为什么要这样做,你就有更大的机会得到赞同。同时也要修复格式 - 保持一致的缩进等。 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接