我初学java  看到数组排序  关于选择排序的算法不是很理解求给看下 红色标记部分public class select {
public static void main(String[] args) {
double[]list={3.21,5.6,8.6,74,9,98,76};
System.out.println("初始数组 ");
   for(int i=0;i<list.length;i++)
   {
   System.out.println(" "+list[i]);
   }
   selectionSorting(list);
   System.out.println();
   System.out.println("排序结束后的数组");
   for(int i=0;i<list.length;i++)
   {
   System.out.println(" "+list[i]);
   }

}
static void selectionSorting(double []list)
{
int index;
double temp;
for (int i = 0; i < list.length; i++) {
index=0;
for (int j = 0; j < list.length-i; j++) { //为什么j< list.length-i
if(list[index]<list[j]) index=j;

}
if(index!=list.length-i-1)//这块也不是很明白
{
int m=list.length-i-1;
   
temp=list[m];
list[m]=list[index];
list[index]=temp;

}
}
}

}


解决方案 »

  1.   

     list.length-i是在限制什么求教。。
      

  2.   

    选择排序就是从前面选出最大的放到后面去。
    list.length-i是分界点,前面是未排序的,后面是排序的
    从0~list.length-i-1里面选出最大的,放到list.length-i-1
      

  3.   

    你自己单步dubug看看值就应该明白了,
    有些一两句话也不好描述
      

  4.   

    第i趟循环,把最大值移到length-i-1位置,如下:1:最大值移到最后一位,下次循环比较最后一值不参与
    3.21,5.6,8.6,74,9,98,76==》3.21,5.6,8.6,74,9,76,98  2:不算最后一位,最大值移到倒数第二位,下次比较后两位不参与
    3.21,5.6,8.6,74,9,98,76==》3.21,5.6,8.6,74,9,76,98  总体思路就是很一次循环记录“0到length-i-2”最大值,因为length-i-2以后的值已经有序if(index!=list.length-i-1)//这块也不是很明白
    这个判断当前比较的最后一位,如果不是最大值,就和最大值交换位置
      

  5.   

    1.首先你这个选择排序是从后往前排,list[index]<list[j]这个是每次比较最大的,比如98放到最后一位,76放到最后第二位,那么后面已经排好了,就可以j< list.length-i
    2.index!=list.length-i-1,这个是循环结束后,如果最大的值正好是当前要排序的位置,比如从后排到第三大的值,index正好是那个位置就不换,如果不是就交换位置
      

  6.   

    首先,要明白 选择排序算法。
    每次遍历,从数组中选择出当前无序集合中的最大(或者最小值)
    楼主的原函数selectionSorting是每次遍历无序数组,选择出当前数组中的最大值,将最大数值,放在
    无序数组的数组尾。static void selectionSorting(double []list){
     int index;
     double temp;
     for (int i = 0; i < list.length; i++) {
        index=0;
        for (int j = 0; j < list.length-i; j++) { 
      //初始化的无序数组长度为length,
      //i,因为从0计数,所以实际的选择次数为0,....(i-1) ,也就是i次。
      // 此时,无序集合长度 length-i,  有序集合长度为i.
      // 所以,j在无序集合中遍历,最大的index为 length-i-1.即 index < length-i

         if(list[index]<list[j]) 
            index=j;
        }
        if(index!=list.length-i-1)// 一次选择结束后,如果最大值,已经在当前无序集合的最后一个位置,则不需要再交换位置。 如果不在无序集合的末尾,那么交换到无序集合的末尾,也就是有序集合的头。(无序集合的最末端,即最大值,有序集合的最前端,即最小值)
        {
            int m=list.length-i-1; 
            temp=list[m];
    list[m]=list[index];
    list[index]=temp;
        }
       }
     }希望我的回答能让你理解。