java实现冒泡排序,选择排序,插入排序算法详解

来源:互联网 发布:淘宝返利微信 编辑:程序博客网 时间:2024/05/17 04:49

java实现冒泡排序,选择排序,插入排序算法详解

算法JavaJ#

  //选择排序,注意内外循环之间有对应的关系
  public static void selectionSort(int[] ary){
   //先选中第一个数,然后从后面这一组元素中找到一个最小的,和前面的这个数交换
    for(int i=0 ; i<ary.length-1 ; i++){//53814
      for(int j=i+1 ;j<ary.length ; j++){
        if( ary[j]<ary[i] ){//如果后面有比前面小的数,就交换
          //交换 i <-> j
          int temp = ary[i];
          ary[i] = ary[j];
          ary[j] = temp;
        }
        //System.out.print("i,j:" + i + "," +j);
        //System.out.println(Arrays.toString(ary));
      }
    }
  }
//  选择排序:通过n-1轮比较,每轮找到一个最小的放到前面。
//  12  3  45  25  46  75  15  12  52
//      6 3 8 4 2 5 9 1   排序的习惯是从小到大
//策略:先选中第一个数,然后从后面这一组元素中找到一个最小的,和前面的这个数交换
//      其次,i向后移一位,j从第三位(j+1)开始往后找,如果找到最小的数就和这个第二个数交换,以此类推,直到倒数第二个数结束。
//     i从0到length-1,j从i+1开始到length
//          if(ary[j]<ary[i])满足就交换
//
//每一轮结束后,对应的位置会出现最小的数
  
  //冒泡排序
  public static void bubbleSort(int[] ary){//只是内层循环中的数在比较,交换
    for(int i=0; i<ary.length-1; i++){
      for(int j=0 ;j<=ary.length-1-i ; j++){//53814
        if(ary[j]>ary[j+1]){//比较内循环中的相邻两个数,如果前面的数比后面的数大,我们就交换一下
          int temp=ary[j];//第一次i=0,j=0,ary[0]>ary[1],35814
          ary[j]=ary[j+1];//第二次i=0,j=1,ary[1]<ary[2],35814
          ary[j+1]=temp;//第三次i=0,j=2,ary[2]>ary[3],35184
          //调试输出语句          //第四次 i=0,j=3,ary[3]>ary[4],35148   每一次循环一下,会将最大值放的对应的最大位置
        }
      }  
    }
  }
// 冒泡排序:
//  策略:每次比较相邻的元素,如果前一个大交换,每轮比较会把最大的交换到最后,完成一个最大的排序。经过n-1轮比较排序完毕。冒泡就是比喻每次有一个大数飘到最后。
//轮号 i=0~<length-1  0-5=length-2-i  此时i=0
//j=0~length-2-i 
  
//插入排序
  public static void insertSort(int ary[]){//只是内层循环中的数在比较,交换
    for(int i = 1; i<ary.length; i++){//注意此时i从1开始变化,第一个数默认不需要排序
      int temp = ary[i];//将第一个数保持到temp变量中
      int j;
      for(j = i-1; j>=0; j--){ //j的变化范围是i-1,到0
        if(temp<ary[j]){//第一次ary[j]就是ary[0]比较ary[0]和ary[1]的大小,如果ary[0]的值比ary[1]大的就将ary[0]的值赋值给ary[1]
          ary[j+1] = ary[j];
        }else{
          break;
        }
      }
      ary[j+1] = temp;//一轮比较完成后,才将保存在temp变量中的ary[i]值赋值给ary[j+1]位置,实现排序效果
      //53814
      //第一次 i=1,ary[1]=3   j=0,ary[0]=5,交换完就完成,因为j>=0
      //第二次i=2,ary[2]=8    j=i-1=1,ary[1]=5,不用交换,j--,ary[0]=3,不交换,j-- 跳出循环体
      //第三次i=3,ary[3]=6    j=i-1=2,ary[2]=8,待交换,接着j--,在比较,发现前面没有比6小的数,所有就将6和8交换,就结束了
      //......
    }
  }
}

0 0
原创粉丝点击