Java冒泡排序法和选择排序法的实现

冒泡排序法和选择排序法

本人学生党一枚。Java学习过程,写这个博客纯属当复习,有什么错误的地方请大家指出来在评论里指点指点我。谢谢

冒泡排序法

概念:

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

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

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

冒泡排序法思路

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]交换。。。以此类推。
通俗点说就是每次找到后面元素的最小值然后与之交换。
选择排序法效率中。

选择排序思路
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]+"  ");
    }*/

  }
}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现冒泡排序算法及对其的简单优化示例

    原理 冒泡排序大概是所有程序员都会用的算法,也是最熟悉的算法之一. 它的思路并不复杂: 设现在要给数组arr[]排序,它有n个元素. 1.如果n=1:显然不用排了.(实际上这个讨论似乎没什么必要) 2.如果n>1: (1)我们从第一个元素开始,把每两个相邻元素进行比较,如果前面的元素比后面的大,那么在最后的结果里面前者肯定排在后面.所以,我们把这两个元素交换.然后进行下两个相邻的元素的比较.如此直到最后一对元素比较完毕,则第一轮排序完成.可以肯定,最后一个元素一定是数组中最大的(因为每次都把相对

  • java冒泡排序和选择排序示例

    冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.至此第一趟结束,将最大的数放到了最后.在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二

  • java数据结构排序算法之树形选择排序详解

    本文实例讲述了java数据结构排序算法之树形选择排序.分享给大家供大家参考,具体如下: 这里我们就来说说选择类排序之一的排序:树形选择排序 在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存下来.树形选择排序是对简单选择排序的改进. 树形选择排序:又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法.首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进

  • java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. 一个算法应该具有以下五个重要的特征: 1.有穷性: 一个算法必须保证执行有限步之后结束: 2.确切性: 算法的每一步骤必须有确切的定义: 3.输入:一个算法有0个或多个输入,以刻画运算对象的初始情况: 4.输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果.没有输出的算法是毫无意义的:

  • java实现选择排序算法

    java实现选择排序算法 public static void selectSort(int[] array) { for (int i = 0; i < array.length - 1; i++) { int min = i; for (int j = i + 1; j < array.length; j++) { if (array[j] < array[min]) { min = j; } } Sort.swap(array, i, min);//交换i和min } } 选择排序

  • 深入Java冒泡排序与选择排序的区别详解

    冒泡排序它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.代码如下: 复制代码 代码如下: public class nums {     public static void main(String[] args){         int []nums = {5,4,3,2,1};         for(int i = 0; i < nums.length; i++){        

  • Java实现冒泡排序与双向冒泡排序算法的代码示例

    冒泡排序: 就是按索引逐次比较相邻的两个元素,如果大于/小于(取决于需要升序排还是降序排),则置换,否则不做改变 这样一轮下来,比较了n-1次,n等于元素的个数:n-2, n-3 ... 一直到最后一轮,比较了1次 所以比较次数为递减:从n-1 到 1 那么总的比较次数为:1+2+3+...+(n-1),  以等差公式计算:(1+n-1)/2*(n-1) ==> n/2*(n-1) ==> (n^2-n) * 0.5 用大O表示算法的时间复杂度:O(n^2) ,  忽略了系数0.5和常数-n

  • Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

    一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

  • Java使用选择排序法对数组排序实现代码

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象:使用JTextArea的setText()方法清空文本域:创建一个整型一维数组,分配长度为10的空间:初始化数组元素,使用Random类的nextInt()方法生成50以内的随机数,使用JTextArea类的append()方法把数组元素显示在文本域控件中:点击"排序"按钮,使用JTextArea类的setText()方法清空

  • java冒泡排序算法代码

    复制代码 代码如下: /** * 原理: * 进行n次循环,每次循环从后往前对相邻两个元素进行比较,小的往前,大的往后 *  * 时间复杂度: * 平均情况:O(n^2) * 最好情况:O(n) * 最坏情况:O(n^2) * * 稳定性:稳定 **/public class 冒泡排序 { public int[] bubbleSort(int[] a, int n) {        for (int i = 0; i < n; i++) {            int flag = 0; 

  • Java对数组实现选择排序算法的实例详解

    一. 算法描述     选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 以下面5个无序的数据为例: 56 12 80 91 20(文中仅细化了第一趟的选择过程) 第1趟:12 56 80 91 20 第2趟:12 20 80 91 56 第3趟:12 20 56 91 80 第4趟

  • Java冒泡排序(Bubble Sort)实例讲解

    举个例子:int[] array = {2,4,9,7,6,5}; 第一轮2和4进行比较,2<4,位置不变.再4和9进行比较,4<9,位置不变.再9和7进行比较,9>7,9和7的位置互换.再9和6进行比较,9>6,9和6的位置互换.再9和5进行比较,9>5,位置互换.第一轮比较的结果就是2 4 7 6 5 9. 第二轮2和4进行比较,2<4,位置不变.再4和7进行比较,4<7,位置不变.再7和5进行比较,7>6,7和6的位置互换.再7和5进行比较,7>

  • Java实现选择排序算法的实例教程

    选择排序概念 选择排序也是一种交换排序算法,和冒泡排序有一定的相似度,因此个人认为选择排序可以视为冒泡排序的一种改进算法.它的思路是这样的: 设现在要给数组arr[]排序,它有n个元素. 1对第一个元素(Java中,下标为0)和第二个元素进行比较,如果前者大于后者,那么它一定不是最小的,但是我们并不像冒泡排序一样急着交换.我们可以设置一个临时变量a,存储这个目前最小的元素的下标.然后我们把这个目前最小的元素继续和第三个元素做比较,如果它仍不是最小的,那么,我们再修改a的值.如此直到和最后一个元素

  • Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import java.util.Arrays; /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ public class EightAlgorithms { //插入排序:时间复杂度o(n^2) p

随机推荐