天天看点

Java经典算法冒泡排序&&选择排序

需求:

数组元素:{24, 69, 80, 57, 13}			
	请对数组元素进行排序。
	排序后的结果应为:{13,24,57,69,80}
	使用冒泡排序法&&选择排序法排序
           

冒泡排序分析:

冒泡排序:			
	相邻元素两两比较,大的往后放第一次完毕,最大值出现在了最大索引处;
	
    **本质:** 通过比较做排序 
    1.比较的次数   双重for 循环   (外循环决定比较多少轮,内循环决定每轮比
    较多少次)
    2.谁 和谁比较   相邻的两个元素  for(变量  外循环  I  内循环 j )
     arr[i]  arr[j]
    3.如何比较   前> 后  交换  arr[j] > arr[j + 1]
           

文字太多不想看? 没关系 接下来上图解;

Java经典算法冒泡排序&&选择排序

这个图里面的值已经交换过来了 只要看排序交换的规律就好了

第一轮 0-1 1-2 2-3 3-4;红色曲线

第二轮 0-1 1-2 2-3;蓝色曲线

第三轮 0-1 1-2;黄色曲线

第四轮 0-1;绿色曲线

轮数

数组中一共五个参数交换四轮
	 如果是八个参数就交换七轮
	 由此得出一个规律 交换多少轮是由数组中有几个参数来定的
	 轮数为:数组名.length - 1;
           

每轮交换次数

第一轮比较四次;
	 第二轮比较三次;
	 第三轮比较两次;
	 第四轮比较一次;
	 交换次数是依次递减的;
	 为什么?
	     因为第一轮比较过后最大数一定在最大索引参数上
	     所以第二轮比较就可以不再比较索引4的参数的
	 由此
           

好,搞明白比较的轮数和每轮比较的次数 接下来就要上代码了

public static void main(String[] args) {
  //定义数组
  int[] arr = {24, 69, 80, 57, 13};
  BubblingArray(arr);冒泡排序  
 }
 
public static void BubblingArray(int[] arr) {
   int a = 0;
   //引入第三方变量
   for(int i = 0; i < arr.length - 1; i++){//外循环决定比较多少轮
    for(int j = 0; j < arr.length - 1 - i; j++){//内循环决定每轮比多少次 arr.length - 1为了防止索引越界
     if(arr[j] > arr[j + 1]){
      a = arr[j];
      //前面的数组参数赋值给第三方变量
      arr[j] = arr[j + 1];
      //后面的数组参数赋值给前面的数组参数
      //例:arr[1] = arr[2];
      arr[j + 1] = a;
      //第三饭变量再赋值给后面的数组参数;
     }
    }
   }
  }
           

外循环没什么好说的就是设置比较多少轮;

内循环是设置每轮比较多少次

j < arr.length - 1 - i;

这行代码运行出来就是递减的

代码包装成了方法;

if语句是用来判断前面的参数是否比后面的参数大 大的话就交换

一开始也分析了 冒泡排序就是前面参数与后面参数交换的

if语句里面就是经典的引入第三方变量反转

选择排序分析:

选择排序:
	原理:从0索引开始,依次与后面的元素作比较,小的在前,大的在后。
	
**本质:** 通过比较做排序 

  1.比较的次数   双重for 循环   (外循环决定比较多少轮,内循环决定每轮比
 较多少次)
  2.谁 和谁比较   相邻的两个元素  for(变量  外循环  I  内循环 j )
  arr[i]  arr[j]
  3.如何比较   arr[0] > arr[1 - max]	
     每轮首元素依次与后面的元素比较
           

OK 上图

Java经典算法冒泡排序&amp;&amp;选择排序

拿数组{13,24,57,69,80}作比较

交换次数:

****

***

**

*

public static void main(String[] args) {
  //定义数组
  int[] arr = {24, 69, 80, 57, 13};
  select(arr);//选择排序
  fang1(arr);//遍历
  
 }
public static void select(int[] arr) {
  int a = 0;
  //第三方变量,作用反转
  for(int i = 0; i < arr.length - 1; i++ ){
   //外循环决定比较多少轮
   for (int j = i + 1; j < arr.length; j++){//内循环决定每轮比多少次  arr.length - 1为了防止索引越界
    if(arr[i] > arr[j]){
     //索引 i 与其他索引比较;
     a = arr[i];
     //索引0赋值给第三方变量
     arr[i] = arr[j];
     arr[j] = a;
    }
   }
  }
 }
           

好的,这就是冒泡与选择排序