黑马程序员技术交流社区

标题: 选择排序出现了问题 [打印本页]

作者: 王渠    时间: 2012-6-7 08:30
标题: 选择排序出现了问题
  1. import java.util.Scanner;

  2. public class Exercise6_17 {
  3.         public static void main(String[] args) {
  4.                 double list[] = new double[10];
  5.                 Scanner input = new Scanner(System.in);
  6.                 System.out.print("Enter ten numbers: ");
  7.                 for (int i = 0; i < 10; i++) {
  8.                         list[i] = input.nextDouble();
  9.                 }
  10.                 list = selectionSort(list);
  11.                 for (int i = 0; i < list.length; i++)
  12.                         System.out.print(list[i] + " ");
  13.         }

  14.         public static double[] selectionSort(double[] list) {
  15.                 for (int i = list.length - 1; i >= 0; i--) {
  16.                         double max = list[i];
  17.                         int maxIndex = i;

  18.                         for (int j = 0; j < i - 1; j++) {
  19.                                 if (list[j] > max) {
  20.                                         max = list[j];
  21.                                         maxIndex = j;
  22.                                 }
  23.                         }

  24.                         if (maxIndex != i) {
  25.                                 list[maxIndex] = list[i];
  26.                                 list[i] = max;
  27.                         }
  28.                 }
  29.                 return list;
  30.         }
  31. }
复制代码

作者: 王渠    时间: 2012-6-7 08:39
ttkl123654 发表于 2012-6-7 08:36
我没弄懂是出现的什么问题?是升序和降序的事?

我也没弄懂...
作者: 丰亚彬    时间: 2012-6-7 08:47
你写的那个排序有点乱,没搞明白~~~我把以前写的给你发一下
  1. package cn.hncj.lianxi;

  2. public class SelectSortDemo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 double[] list = {6.3,2.7,1.0,3.0};
  8.                 selectSort(list);
  9.                 StringBuilder sb = new StringBuilder();
  10.                 for(double d : list)
  11.                 {
  12.                         sb.append(d+",");
  13.                 }
  14.                 sb.deleteCharAt(sb.length()-1);
  15.                 System.out.println(new String(sb));

  16.         }
  17.        
  18.         public static void selectSort(double[] list)
  19.         {
  20.                 for(int x=0;x<list.length;x++)
  21.                 {
  22.                         for(int y=x;y<list.length;y++)
  23.                         {
  24.                                 if(list[x]>list[y])
  25.                                         swap(list,x,y);
  26.                                
  27.                         }
  28.                        
  29.                 }
  30.         }
  31.        
  32.         private static void swap(double[] list,int a,int b)
  33.         {
  34.                 double temp = list[a];
  35.                 list[a] = list[b];
  36.                 list[b] = temp;
  37.                
  38.         }

  39. }
复制代码

作者: 王渠    时间: 2012-6-7 08:50
ttkl123654 发表于 2012-6-7 08:44
不是,我想问的是问题是什么啊?
你不是说出问题了吗?是排列的顺序想按从大到小?还是什么问题啊? ...

在运行结果上面有问题
作者: 王渠    时间: 2012-6-7 08:56
ttkl123654 发表于 2012-6-7 08:53

要求的是用选择,不是冒泡,而且是选择大的,来进行排序,题目是这样的...
作者: 丰亚彬    时间: 2012-6-7 08:58
  1. package cn.hncj.lianxi;

  2. public class SelectSortDemo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 double[] list = {6.3,2.7,1.0,3.0};
  8.                 selectSort(list);
  9.                 StringBuilder sb = new StringBuilder();
  10.                 for(double d : list)
  11.                 {
  12.                         sb.append(d+",");
  13.                 }
  14.                 sb.deleteCharAt(sb.length()-1);
  15.                 System.out.println(new String(sb));

  16.         }
  17.        
  18.         public static void selectSort(double[] list)
  19.         {
  20.                 for(int x=0;x<list.length;x++)
  21.                 {
  22.                         for(int y=x;y<list.length;y++)
  23.                         {
  24.                                 if(list[x]<list[y])
  25.                                         swap(list,x,y);
  26.                                
  27.                         }
  28.                        
  29.                 }
  30.         }
  31.        
  32.         private static void swap(double[] list,int a,int b)
  33.         {
  34.                 double temp = list[a];
  35.                 list[a] = list[b];
  36.                 list[b] = temp;
  37.                
  38.         }

  39. }
复制代码
改一个地方就是选择大的
作者: 王渠    时间: 2012-6-7 09:05
本帖最后由 王渠 于 2012-6-7 09:07 编辑
丰亚彬 发表于 2012-6-7 08:58
改一个地方就是选择大的

{:3_54:}感觉你和另外一个回答的,都是用到了遍历,这样每次循环交换的次数会比较多,而我看选择法,选择最大的,放到正确位置,再选择其次,这样循环直到放好。
虽然用了是能解决问题,但还是不知道我出问题在哪儿....
作者: 丰亚彬    时间: 2012-6-7 09:07
王渠 发表于 2012-6-7 09:05
感觉你和另外一个回答的,都是用到了遍历,而我看选择法,选择最大的,放到正确位置,再选择其次 ...

你不是要使用选择排序吗?你是想升序排列还是降序排列
作者: 王渠    时间: 2012-6-7 09:11
ttkl123654 发表于 2012-6-7 09:07

运行结果还是错误的。。。
作者: 王渠    时间: 2012-6-7 09:13
丰亚彬 发表于 2012-6-7 09:07
你不是要使用选择排序吗?你是想升序排列还是降序排列

升序的..选择最大的,放到最后面,接着在剩下的数组中找到最大的,放到倒数第二位,依此类推,直至数列中仅剩一个数。题目原话
作者: 丰亚彬    时间: 2012-6-7 09:14
王渠 发表于 2012-6-7 09:05
感觉你和另外一个回答的,都是用到了遍历,这样每次循环交换的次数会比较多,而我看选择法,选择 ...

你的目的是选择排序,但是你的程序每次只记录了那个最大的但是你没有排序呀,所以你说你要排序但是程序表达的意思感觉是选择最大或者最小
作者: 王渠    时间: 2012-6-7 09:17
丰亚彬 发表于 2012-6-7 09:14
你的目的是选择排序,但是你的程序每次只记录了那个最大的但是你没有排序呀,所以你说你要排序但是程序表 ...

我是选择到最大的后,再判断最大的是否在正确的位置,如果不在,就交换,这就是我程序的意思
作者: 丰亚彬    时间: 2012-6-7 09:17
王渠 发表于 2012-6-7 09:13
升序的..选择最大的,放到最后面,接着在剩下的数组中找到最大的,放到倒数第二位,依此类推,直至数列中 ...

嗯,对的,你排序算法就有问题,你只找到了那个最大的,你都没有和数组当前最后一个元素进行换位,你看看我给你发的那个代码
作者: 王渠    时间: 2012-6-7 09:20
丰亚彬 发表于 2012-6-7 09:17
嗯,对的,你排序算法就有问题,你只找到了那个最大的,你都没有和数组当前最后一个元素进行换位,你看看 ...

这段代码就是用来判断位置是否正确并且排序的
  1.                         if (maxIndex != i) {
  2.                                 list[maxIndex] = list[i];
  3.                                 list[i] = max;
  4.                         }
复制代码

作者: 王渠    时间: 2012-6-7 11:05
  1. import java.util.Scanner;

  2. public class Exercise6_17 {
  3.         public static void main(String[] args) {
  4.                 double list[] = new double[10];
  5.                 Scanner input = new Scanner(System.in);
  6.                 System.out.print("Enter ten numbers: ");
  7.                 for (int i = 0; i < 10; i++) {
  8.                         list[i] = input.nextDouble();
  9.                 }
  10.                 list = selectionSort(list);
  11.                 for (int i = 0; i < list.length; i++)
  12.                         System.out.print(list[i] + " ");
  13.         }

  14.         public static double[] selectionSort(double[] list) {
  15.                 for (int i = list.length - 1; i >= 0; i--) {
  16.                         double max = list[i];
  17.                         int maxIndex = i;

  18.                         for (int j = 0; j < i; j++) {//找到错误原因...这里应该是j<i;而不是j< i - 1;
  19. if (list[j] > max) {
  20.                                         max = list[j];
  21.                                         maxIndex = j;
  22.                                 }
  23.                         }

  24.                         if (maxIndex != i) {
  25.                                 list[maxIndex] = list[i];
  26.                                 list[i] = max;
  27.                         }
  28.                 }
  29.                 return list;
  30.         }
  31. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2