黑马程序员技术交流社区

标题: 关于选择排序的优化 [打印本页]

作者: 张先庆    时间: 2013-7-20 15:25
标题: 关于选择排序的优化
本帖最后由 杨兴庭 于 2013-7-21 12:32 编辑

class SelectSort
{
public static void main(String[] args)
{
  
  int temp []={34,56,76,2,670,8,1};
  System.out.println("排序之前......."+temp);
  //调用函数对排序前结果进行打印
  printArray(temp);
  //调用函数对数组进行排序
  selectSort(temp);
  //调用函数对排序后结果进行打印
  System.out.println("排序之后.......");
  printArray(temp);
}
public static void selectSort(int arr[])      
{
  //外层循环控制比较的轮数
  for(int i=0;i<arr.length-1;i++)
  {
   int min=i;//用min记录每轮比较中最小那个数的角标
   for(int j=i+1;j<arr.length;j++)
   {
   
    if(arr[min]>arr[j])//
    {
     
     min=j;
    }
   
   }
   
   
    swap(arr,i,min);
   
   
   
  
  }
}

/*
  完成数组的打印功能
*/
public static void printArray(int arr[])
{
  for(int i=0;i<arr.length;i++)
  {
   System.out.println(arr);
  }
}
public static void swap(int []arr,int x,int y)
{
  
  arr[x]=arr[x]^arr[y];
  arr[y]=arr[x]^arr[y];
  arr[x]=arr[x]^arr[y];
}
}
为什么不对????????????????

QQ图片20130720152234.jpg (27.57 KB, 下载次数: 0)

QQ图片20130720152234.jpg

作者: wedge    时间: 2013-7-20 15:48
int min=i;//用min记录每轮比较中最小那个数的角标
   for(int j=i+1;j<arr.length;j++)
   {
   
    if(arr[min]>arr[j])//
    {
     
     min=j;
    }
   
   }
   
   
    swap(arr,i,min);
当i=5时,也就是此时的序列为1 2 8 34 56 76 670 你看你的代码还是使用了swap(arr,5,5);最后将76变成了
0放到数组里面去了。所以你在使用swap的时候应该判断一下 i==min?不交换:交换 这样子。希望你再仔细看看。
作者: 王广亚    时间: 2013-7-20 16:46
本帖最后由 王广亚 于 2013-7-20 16:47 编辑
  1. package e1;

  2. public class SelectSort{
  3.         public static void main(String[] args) {
  4.                 int temp []={34,56,76,2,670,8,1};
  5.                 System.out.println("排序之前.......");
  6.                 //调用函数对排序前结果进行打印
  7.                 printArray(temp);
  8.                 //调用函数对数组进行排序
  9.                 selectSort(temp);
  10.                 //调用函数对排序后结果进行打印
  11.                 System.out.println("排序之后.......");
  12.                 printArray(temp);
  13.         }
  14.         public static void selectSort(int arr[]){
  15.                 for(int i=0;i<arr.length-1;i++){
  16. //                        int min=i;//为什么要标记最小那个数的角标?只要前面的数大就换为就行了。
  17.                         for(int j=i+1;j<arr.length;j++){   
  18.                                 if(arr[i]>arr[j]){   
  19.                                         swap(arr,j,i);
  20.                                 }   
  21.                         }   
  22.                         
  23.                 }
  24.         }
  25. /*
  26.   完成数组的打印功能
  27. */
  28.         public static void printArray(int arr[]){
  29.                 for(int i=0;i<arr.length;i++){
  30.                         System.out.print(arr[i]+", " );//此处不要println,用了没打印一个元素就会换行
  31.                 }
  32.                 System.out.print("\n");
  33.         }
  34.         public static void swap(int []arr,int x,int y){
  35.                 arr[x]=arr[x]^arr[y];
  36.                 arr[y]=arr[x]^arr[y];
  37.                 arr[x]=arr[x]^arr[y];
  38.         }
  39. }
复制代码

作者: xuaner0719    时间: 2013-7-20 19:21
同学你是不是传智0712基础班的,这代码。。。
作者: 云游天下    时间: 2013-7-21 00:34
这个算优了吧 自己刚编的
class SelectSort {
        public static void main(String[] args) {
                int [] i={99,33,44,22,66,55,77,88,33,66};
                getPaiXu(i);
        }

        public static void getPaiXu(int [] arr){
               
                for (int x=0; x< arr.length-1; x++){
                        for (int y=x+1; y< arr.length; y++){
                       
                                if (arr[x]>arr[y]) {
                                        int s=arr[x];
                                        arr[x]=arr[y];
                                        arr[y]=s;
                                }
                        }
                }
                for (int x=0;x<arr.length; x++){
                        System.out.print(arr[x]+" ");
                }
        }
}




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