使用Java怎么实现一个冒泡排序法和选择排序法

2021/4/18 22:29:56
栏目: 其他类
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

使用Java怎么实现一个冒泡排序法和选择排序法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

冒泡排序法

概念

从前向后(或从后向前)依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,像水底的气泡逐渐向上冒,顾名思义冒泡排序法。 

通俗一点就是把大的往上挪!向冒泡一样。 

是交换式排序法的一种。冒泡排序法效率较低。 

image.png

冒泡排序法思路

1:外层循环:控制它要走几次。 
假设你有5个数,那就要走4次,最后一次不用走,最后那个数已经在它位置了所以就要length-1次。 
2:内层循环:控制逐一比较,如果发现前一个数比后一个数大,则交换。 
注意!因为越比较长度就越小了,所以长度要length-1-i。

package com.test_1;public class Demo5_3 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub    int arr [ ] ={1,6,0,-1,9};
    int temp=0;//中间值    //-------冒泡排序法    //外层循环,它决定一共走几趟    for(int i = 0;i<arr.length-1;i++){
      //内层循环,开始逐个比较      //如果我们发现前一个数比后一个数大,则交换      for(int j=0;j<arr.length-1-i;j++){
        if (arr[j]>arr[j+1]) {
          //换位          temp = arr[j];
          arr[j] = arr[j+1];
          arr[j+1] = temp;
        }
      }

    }
    //输出结果    for(int i = 0;i<arr.length;i++){
      System.out.print(arr[i]);
    }

  }

}

选择排序法

概念: 
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。第二次从R[1]~R[n-1]中选取最小值与R[1]交换。。。以此类推。 
通俗点说就是每次找到后面元素的最小值然后与之交换。 
选择排序法效率中。 

image.png

选择排序思路 
1:外层循环:要走几趟,同样是length-1。 
2:设置一个最小值。假设第一个就是最小值。 
3:设置一个最小值下标 
4:内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。 
5:退出内层循环后就交换位置。

package com.test_1;public class Demo5_3 {

  public static void main(String[] args) {


    //简单测试数组    int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};

    //调用选择排序法    Select select = new Select();
    select.sort(arr);
  }

}//--------------选择排序法class Select{
  public void sort(int arr[]){
    //中间值    int temp = 0;

    //外循环:我认为最小的数,从0~长度-1    for(int j = 0; j<arr.length-1;j++){
      //最小值:假设第一个数就是最小的      int min = arr[j];
      //记录最小数的下标的      int minIndex=j;

      //内循环:拿我认为的最小的数和后面的数一个个进行比较      for(int k=j+1;k<arr.length;k++){
        //找到最小值        if (min>arr[k]) {
          //修改最小          min=arr[k];
          minIndex=k;
        }
      }
      //当退出内层循环就找到这次的最小值      //交换位置      temp = arr[j];
      arr[j]=arr[minIndex];
      arr[minIndex]=temp;
    }
    //输出结果    for(int i = 0;i<arr.length;i++){
      System.out.print(arr[i]+"  ");
    }

  }
}

最后再比较一下两个排序法之间的效率差异: 
代码

package com.test_1;

import java.util.Calendar;public class Demo5_3 {

  public static void main(String[] args) {

    //构建一个庞大的无序数组用于测试时间    int len=100000;
    int arr1 [] = new int [len];
    for(int i=0;i<len;i++){
      //让程序随机产生一个1~10000的数      //Math.random()会产生一个0~1的数      int t = (int)(Math.random()*10000);
      arr1[i] = t;
    }

    //简单测试数组    int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};

    //获得时间实例    Calendar cal = Calendar.getInstance();

    //在排序前打印系统时间    System.out.println("冒泡排序法开始"+cal.getTime());
    //调用冒泡排序法    Bubble bubble = new Bubble();
    bubble.sort(arr1);
    //重新获得时间实例    cal = Calendar.getInstance();
    System.out.println("冒泡排序法结束"+cal.getTime());


    //重新获得时间实例    cal = Calendar.getInstance();
    System.out.println("选择排序法开始"+cal.getTime());
    //调用选择排序法    Select select = new Select();
    select.sort(arr1);
    //重新获得时间实例    cal = Calendar.getInstance();
    System.out.println("选择排序法结束"+cal.getTime());
  }

}//-----------------冒泡排序法class Bubble{
  //排序方法  public void sort(int arr[]){
    int temp=0;//中间值    //-------冒泡排序法    //外层循环,它决定一共走几趟    for(int i = 0;i<arr.length-1;i++){
      //内层循环,决定每一趟循环的次数      //如果我们发现前一个数比后一个数大,则交换      for(int j=0;j<arr.length-1-i;j++){
        if (arr[j]>arr[j+1]) {
          //换位          temp = arr[j];
          arr[j] = arr[j+1];
          arr[j+1] = temp;
        }
      }

    }  
    /*//输出结果
        for(int i = 0;i<arr.length;i++){
          System.out.print(arr[i]+"  ");
        }*/  }  
}//--------------选择排序法class Select{
  public void sort(int arr[])  {
    //中间值    int temp = 0;

    //外循环:我认为最小的数,从0~长度-1    for(int j = 0; j<arr.length-1;j++)
    {
      //最小值:假设第一个数就是最小的      int min = arr[j];
      //记录最小数的下标的      int minIndex=j;

      //内循环:拿我认为的最小的数和后面的数一个个进行比较找到下标      for(int k=j+1;k<arr.length;k++)
      {
        //找到最小值        if (min>arr[k]) 
        {
          //修改最小          min=arr[k];
          minIndex=k;
        }
      }
      //当退出内层循环就找到这次的最小值      //交换位置      temp = arr[j];
      arr[j]=arr[minIndex];
      arr[minIndex]=temp;
    }
    /*//输出结果
    for(int i = 0;i<arr.length;i++){
      System.out.print(arr[i]+"  ");
    }*/  }
}

运行结果:

image.png

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注辰讯云资讯频道,感谢您对辰讯云的支持。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: Neo4j 手动索引怎样删除