A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王自强 于 2012-8-29 13:37 编辑

这样的选择排序听老师说很低效,有没有高效点的。        
for(int x=0;x<arr.length-1;x++)
        {
                for(int y=x+1;y<length;y++)
                {
                        if(arr[x]>arr[y])
                        {
                                        int temp = arr[x];
                                arr[x] = arr[y];
                                arr[y] = temp;
                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

4 个回复

倒序浏览
本帖最后由 王博 于 2012-8-25 09:32 编辑


public void selectSort(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])
    {
     swap(arr,x,y);
    }
   }
  }
}

public void bubbleSort(int[] arr)
{
  for (int x=0 ;x<arr,length-1 ;x++ )
  {
   for (int y=0;y<arr.length-x-1 ;y++ )
   {
    if (arr[x]>arr[y])
    {
     swap(arr,y,y+1);
    }
   }
  }
}
public void swap(int[] arr,int a,int b)
{
  int temp = arr[a];
  int a = arr;
  int b = temp;
     
      //由于两个都有换位置的功能,可以把它提出来单独封装成一个函数。
}


这样可以稍微提高了一下效率吧


回复 使用道具 举报
快速排序发:一次排2个最值。你可以看下
class QuickSort {
        public void quickSort(String[] strDate,int left,int right){//数组,左角标,右角标。
                String middle,tempDate;//中间角标,和交换时的中间变量。
                int i,j;
                i=left;
                j=right;
                middle=strDate[(i+j)/2];//中间角标
                do{//将比中间值小的放左边,比中间值大的放右边
                        while(strDate[i].compareTo(middle)<0&& i<right)
                                i++; //找出左边比中间值大的数
                        while(strDate[j].compareTo(middle)>0&& j>left)
                                j--; //找出右边比中间值小的数
                        if(i<=j){ //将左边大的数和右边小的数进行替换
                                tempDate=strDate[i];
                                strDate[i]=strDate[j];
                                strDate[j]=tempDate;i++;j--;
                        }
                }
                while(i<=j);
                //当两者交错时停止
                if(i<right){//将[i]到right再次进行递归。直到每次得到排序的最大值。
                        quickSort(strDate,i,right);
                }
                if(j>left){//将left到j再次进行递归。直到每次得到排序的最小值。
                        quickSort(strDate,left,j);
                }
        }       
        //因为是用递归法,而且一次两边一起排,所以效率很高。但如果数太多了,就会出问题。
        public static void main(String[] args){
                String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};
                QuickSort sort=new QuickSort();
                sort.quickSort(strVoid,0,strVoid.length-1);
                for(int i=0;i<strVoid.length;i++){
                        System.out.println(strVoid[i]+" ");
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
刘源 发表于 2012-8-25 12:22
快速排序发:一次排2个最值。你可以看下
class QuickSort {
        public void quickSort(String[] strDate,int  ...

呵呵 谢谢了
受教了
回复 使用道具 举报
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马