想实现从数组里进行排序,但老报数组越界,能解释下原因么?能给几个其他排序的列子么,如:冒泡排序,堆排序等。谢谢//代码如下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];
}
}
}
}
}
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];
}
}
}
}
}
arr[i]=arr[j];
arr[j] = temp ;//这里!
{ 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;
}
}
}
}
}
for(int j = i+1;j <arr.length;j++) //还有这里,是j <arr.length,
不是i <arr.length
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;
}
}
}
}
参考代码:(冒泡排序、堆排序-指大堆排序)//冒泡排序:相邻交换。大的下沉。小的上升。
//当某一趟没有发生交换时,立即结束。
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);//调整堆
}
}