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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姜姗姗 中级黑马   /  2014-4-9 22:20  /  1589 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. package test;//选择排序
  2. //需求:对数组{34,19,11,109,3,56}进行“选择排序”
  3. /*  分析:
  4. *  数组 {34,19,11,109,3,56}
  5. *  角标    0         1        2  3  4  5
  6. *  第一轮:0角标上的元素和1,2,3,4,5角标上的元素分别进行比较,如果0角标小,不用动,否则交换位置       
  7. *  第一轮    0---->1,2,3,4,5   0和1,2,3,4,5比较
  8. *  第二轮    1---->  2,3,4,5   1和     2,3,4,5比较
  9. *  第三轮    2---->    3,4,5   2和          3,4,5比较
  10. *  第四轮    3---->      4,5   3和               4,5比较
  11. *  第五轮    4---->        5   4和             5比较
  12. *  
  13. 该列对应外循环    横线右边  对应内循环   
  14. *  
  15. * 一共5轮,第几轮对应外循环,外循环0到4,5取不到 for(int x=0;x<arr.length-1;x++){ }
  16. * 内循环是每一轮比较的次数,第一轮5次,第二轮4次……
  17. * 每一轮 内循环y的初始值都不一样,所以这也就说明y的初始值不确定,不能指定具体的值,看y和行x有什么关系,y=x+1
  18. * 那内循环y的取值呢,第一个值和最后一个都值能取到,所以是y<arr.length
  19. *  明确1  有没有返回值?没有
  20. *  明确2        有没有未知内容参与?有  数组 int[]
  21. *   */
  22. public class test25 {
  23.         public static void main(String args[]){
  24.                 int [] arr ={34,19,11,109,3,56};
  25.                 sortArr(arr);
  26.                 //System.out.println(arr);//直接打印数组是个什么东西,只能是遍历才能取出来,遍历打印
  27.                
  28.                 for(int i=0;i<arr.length-1;i++){
  29.                         System.out.print(arr[i]+",");
  30.                 }
  31.                
  32.                
  33.         }
  34.         public static void sortArr(int []arr){
  35.                 for(int x=0;x<arr.length-1;x++){//对应有几轮
  36.                         for(int y=x+1;y<arr.length;y++){//对应每轮比较几次
  37.                                 if(arr[x]>arr[y])//目的是x这边放最小的,如果是arr[x]>arr[y]就要交换
  38.                                 {
  39.                                         int temp = arr[x];
  40.                                         arr[x] = arr[y];
  41.                                         arr[y] = temp;
  42.                                        
  43.                                 }               
  44.                                
  45.                         }
  46.                 }
  47.                
  48.         }
  49. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 panzhenglian 于 2014-4-18 22:36 编辑

楼主你的排序方式效率很低,在内圈每次排序之后先不要移动,记住最大数的角标位,内圈一圈走完再进行移动,我曾经实验过同样的10000个整数进行排序,如果是不记住角标位这种算法,在我的电脑上面排序需要的时间大概是是300毫秒,如果记住角标位再移动,排序需要的时间是70毫秒,而java自带的Arrays类里面的排序需要的时间是3毫秒,到现在我看不懂java中Arrays类的排序是如何做到的,
回复 使用道具 举报
  1. class MyArrays{

  2.         /**
  3.                 排序方式一,效率高                :属于选择排序
  4.        
  5.         */
  6.         public static void sort1(int[] arr){
  7.                 int dexMin = 0;
  8.                 for(int i = 0 ; i < arr.length ; i++){
  9.                         dexMin = i;
  10.                         for(int j = i + 1 ; j < arr.length ; j++){               
  11.                                 if(arr[dexMin]>arr[j]){
  12.                                         dexMin = j;       
  13.                                 }
  14.                         }
  15.                         if(dexMin!=i){
  16.                                 exchangeArr(arr,dexMin,i);
  17.                         }
  18.                 }
  19.         }
  20.        
  21.         /**
  22.        
  23.         排序方式二,效率低                        :属于选择排序
  24.        
  25.         */
  26.         public static void sort2(int[] arr){
  27.                 for(int i = 0 ; i < arr.length ; i++){               
  28.                         for(int j = i + 1 ; j < arr.length ; j++){               
  29.                                 if(arr[i]>arr[j]){
  30.                                         exchangeArr(arr,i,j);
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35.        
  36.         /**
  37.        
  38.         排序方式三,效率居中                                        :属于冒泡排序
  39.        
  40.         */
  41.         public static void sort3(int[] arr){
  42.                 for(int i = 0 ; i < arr.length ; i ++){
  43.                         for(int x = 0 , y = x + 1 ;y < arr.length - i ; x ++ , y ++){
  44.                                 if(arr[x]>arr[y]){                               
  45.                                         exchangeArr(arr,x,y);
  46.                                 }                       
  47.                         }
  48.                 }
  49.         }

  50.        
  51.   /**
  52.    *        遍历数组,打印到控制台
  53.    */
  54.         public static void printArr(int[] arr){
  55.                 for(int i = 0 ; i < arr.length ; i ++){
  56.                         System.out.print(arr[i]+" , ");
  57.                 }
  58.         }
  59.        
  60.         //私有方法,给数组提供换位服务
  61.         private static void exchangeArr(int[] arr , int a , int b){
  62.                 /*
  63.                 arr[a] = arr[a]^arr[b];
  64.                 arr[b] = arr[a]^arr[b];                异或换位//根据测试的时间上看,异或换位和利用第三方变量换位所需要的时间是一样的
  65.                 arr[a] = arr[b]^arr[a]; */
  66.                
  67.                 int i = arr[a];
  68.                 arr[a] = arr[b];
  69.                 arr[b] = i;       
  70.         }
  71.        
  72.    /**
  73.         *        获取一个int类型数组;通过传入的参数决定数组的长度,该方法随机生成随机数填充到数组中
  74.         */
  75.         public static int[] getIntArr(int len){
  76.                
  77.                 Random random = new Random(1245125L);                //传入随机数种子,这样每次生成的10000个随机数都是一样的
  78.                 int[] arr = new int[len];
  79.                 for(int i = 0; i < arr.length ; i++){
  80.                         arr[i] = random.nextInt(100000);
  81.                 }
  82.                 return arr;
  83.         }
  84. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马