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