日期:2014-05-20  浏览次数:20865 次

关于选择排序的算法
我初学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;

}
}
}

}



------解决方案--------------------
选择排序就是从前面选出最大的放到后面去。
list.length-i是分界点,前面是未排序的,后面是排序的
从0~list.length-i-1里面选出最大的,放到list.length-i-1
------解决方案--------------------
第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)//这块也不是很明白
这个判断当前比较的最后一位,如果不是最大值,就和最大值交换位置
------解决方案--------------------
1.首先你这个选择排序是从后往前排,list[index]<list[j]这个是每次比较最大的,比如98放到最后一位,76放到最后第二位,那么后面已经排好了,就可以j< list.length-i
2.index!=list.length-i-1,这个是循环结束后,如果最大的值正好是当前要排序的位置,比如从后排到第三大的值,index正好是那个位置就不换,如果不是就交换位置
------解决方案--------------------
首先,要明白 选择排序算法。
每次遍历,从数组中选择出当前无序集合中的最大(或者最小值)
楼主的原函数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];