想实现从数组里进行排序,但老报数组越界,能解释下原因么?能给几个其他排序的列子么,如:冒泡排序,堆排序等。谢谢//代码如下public class Test1 {
private static int arr[] = {1,4,6,7,3,2};
public static void main(String args[])
{
for(int i = 0;i<arr.length;i++)
{
sorted(arr);
System.out.print(arr[i]);
}
}
public static void sorted(int arr[])
{
for(int i = 0;i<arr.length;i++){
for(int j = i+1;i<arr.length;j++)
{
if(arr[j]<arr[i]){
int temp = arr[i];
arr[i]=arr[j];
arr[j] = arr[i];
}
}
}
}
}

解决方案 »

  1.   

    int temp = arr[i]; 
    arr[i]=arr[j]; 
    arr[j] = temp ;//这里!
      

  2.   

    public class SelectSort
    {    private static int arr[] = { 1, 4, 6, 7, 3, 2 };    public static void main(String args[])
        {
            sorted(arr);
            for (int i = 0; i < arr.length; i++)
            {
                System.out.print(arr[i]);
            }
        }    public static void sorted(int arr[])
        {
            for (int i = 0; i < arr.length; i++)
            {
                for (int j = i + 1; j < arr.length; j++)
                {
                    if (arr[j] < arr[i])
                    {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
        }
    }
      

  3.   

    for(int i = 0;i <arr.length;i++){ 
    for(int j = i+1;j <arr.length;j++) //还有这里,是j <arr.length,
    不是i <arr.length
      

  4.   


    public static void sorted(int arr[]) 

         for(int i = 0;i <arr.length;i++){ 
              for(int j = i+1;i <arr.length;j++) {
                   if(arr[j] <arr[i]){ 
                        int temp = arr[i]; 
                        arr[i]=arr[j]; 
                        arr[j] = arr[i]; 
                   } 
              }
         }
    }当i=arr.length时,j=i+1,而i<arr.length为真,所以产生越界
    下面是冒泡排序public static void sorted(int[] arr) 

         for(int i = 1;i <arr.length;i++){ 
              for(int j=0;j<arr.length-1;j++){
                   if(arr[j] <arr[j+1]){ 
                        int temp = arr[j]; 
                        arr[j]=arr[j+1]; 
                        arr[j+1] = temp; 
                   } 
              }
         }
    }
      

  5.   

    答:楼上的冒泡写得太粗。
    参考代码:(冒泡排序、堆排序-指大堆排序)//冒泡排序:相邻交换。大的下沉。小的上升。
    //当某一趟没有发生交换时,立即结束。
    public static void bubbleSort(int[] data)
    {
    for(int i=1;i<data.length-1;i++)//一共是data.length-1趟
    {
    boolean hasSwap=false;//本趟还没有发生交换过;
    //由于每次的最大沉到底,故只要从0---data.length-1-i冒泡就行了
    for(int j=0;j<=data.length-1-i;j++)
    {//冒泡的含义是:相邻的两两比较,大的值向下沉。
    if(data[j]>data[j+1])

                        int temp = data[j]; 
                        data[j]=data[j+1]; 
                        data[j+1] = temp;//交换。大的下沉。小的上升。
                        hasSwap=true;//本趟已发生过交换。
         }//if
          }//for(j)
    if(!hasSwap)//若本趟没有发生交换,则再也不需要冒泡了。立即结束。
    {
    break;
    }
    }//for(i)
    }

    //对数组data建堆。data[0]不用。从data[1]开始。
    //i表示它的左右两个儿子已是大堆,加入自己,成为更大的堆。
    private static void buildHeap(int[] data,int i,int n)
    {
    int w=data[i];//将自己暂存
    int j=2*i;//自己的左儿子
    while(j<=n)//当自己还有儿子时
    {
    if(j+1<=n && data[j+1]>data[j])
    {j++;}//j指向两个儿子中值最大的那一个
    if(w>data[j]){break;}//若自己值最大,则堆已建好。
    data[i]=data[j];//儿子值成为堆顶
    i=j;//自己下去
    j=2*i;//自己的新的左儿子

    }//while
    data[i]=w;//这是自己应该呆的位置
    }

    //对数组data进行堆排序data[0]不用。从data[1]开始
    public static void heapSort(int[] data)
    {
    int n=data.length-1;
    for(int i=n/2;i>=1;i--)
    {
    buildHeap(data, i, n);//建成大堆
    }
    while(n>=2)
    {
    //将data[1]<->data[n]交换
    int t=data[1];
    data[1]=data[n];
    data[n]=t;
    n--;//已排好序了一个
    buildHeap(data, 1, n);//调整堆
    }
    }