java小白学习记录:冒泡排序和选择排序

一、冒泡排序
冒泡排序的原理为:
  拿第一个数与第二个数比较,将这两个数中较大的数放在第二个位置,较小的数放在第一个位置;再拿刚比较过大小后得到的第二个数与第三个数比较,将这两个数中较大的数放在第三个位置,较小的数放在第二个位置;依次类推,直到第n-1个数。这是将比较大小过后得到的第n-1个位置上的数与最后一个数比较,将这两个数中较大的数放在第n-1个位置,较小的数放在最后一个位置。此时我们可以确定最后一个位置上的数是最大的数。然后再从头开始重复上面的操作,这次只需要比较到n-1的位置,这样我们就得到了第二大的数。一直重复该操作,直到第n-1轮。我们只需要比较第一个与第二个数的大小,将这两个数中较大的数放在第二个位置,较小的数放在第一个位置。便完成了这个数组的排序。例如:
java小白学习记录:冒泡排序和选择排序_第1张图片

public static void main(String[] args) {
    Random rand = new Random();//调用随机数工具
    int[] array = new int[10];  //定义一个长度为10,数据类型为int型的数组
   array[0] = 1+rand.nextInt(100);  //将数组的第一个数赋值为1-100之间的一个随机数

    //使用for循环依次为数组的各个位置赋值
   for (int i = 1; i <array.length ;i++ ) {
        array[i] = 1+rand.nextInt(100);

        //使用for循环确保新生成的值,不重复
        for (int j = 0; j <i ; j++) {
            //循环遍历,依次比较是否有值与本次所赋的值相等,如果存在相等的值,重新给这个位置赋值
            if (array[i]==array[j]){
                i--;
                break;
            }
        }
    }

   //使用增强型for循环输出原数组的排序方式
    System.out.print("排序前:");
    for (int i : array) {
        System.out.print(i+"\t");
    }
    System.out.println();

    //冒泡排序
    //外层循环控制轮次
    for (int i = 0,t; i <array.length-1 ; i++) {
        //内层控制每一轮比较多少次
        for (int j = 0; j<array.length-1-i ; j++) {
            //当前这个数据与下一个数据比较大小。大的数放在后面,小的放在前面。一个一个向后比较
            if (array[j]>array[j+1]){
                t=array[j];
                array[j]=array[j+1];
                array[j+1]=t;
            }
        }
    }

    //使用增强型for循环输出排序后数组的排序方式
    System.out.print("排序后:");
    for (int i : array) {
        System.out.print(i+"\t");
    }

程序及结果如下:

java小白学习记录:冒泡排序和选择排序_第2张图片

二、选择排序:
选择排序原理如下:
java小白学习记录:冒泡排序和选择排序_第3张图片

public static void main(String[] args) {
    Random rand = new Random();//调用随机数工具
    int[] array = new int[10];  //定义一个长度为10,数据类型为int型的数组
   array[0] = 1+rand.nextInt(100);  //将数组的第一个数赋值为1-100之间的一个随机数

    //使用for循环依次为数组的各个位置赋值
   for (int i = 1; i <array.length ;i++ ) {
        array[i] = 1+rand.nextInt(100);

        //使用for循环确保新生成的值,不重复
        for (int j = 0; j <i ; j++) {
            //循环遍历,依次比较是否有值与本次所赋的值相等,如果存在相等的值,重新给这个位置赋值
            if (array[i]==array[j]){
                i--;
                break;
            }
        }
    }

   //使用增强型for循环输出原数组的排序方式
    System.out.print("排序前:");
    for (int i : array) {
        System.out.print(i+"\t");
    }
    System.out.println();
    //选择排序
//外层循环控制轮次
for (int i = 0,a,b,t; i <array.length ; i++) {
    //记录两个下标位置,0位置和每轮需要比较到的最后一个位置
    a = 0;
    b = array.length-1-i;
    //内层控制每一轮比较多少次
    for (int j = 1; j <=b ; j++) {
        //判断出最大值对应的下标位置
        if (array[a]<array[j]){
            a = j;//将最大数的下标位置赋给a
        }
    }
    //此时我们判断这个下标是否为本轮最后一个,如果是,则最后一个数为最大值,如果不是,则将记录下标对应的值,与最后一个值交换位置
    if(b != a){
        t = array[b];
        array[b] = array[a];
        array[a] = t ;
    }
}

//使用增强型for循环输出排序后数组的排序方式
System.out.print("排序后:");
for (int i : array) {
    System.out.print(i+"\t");
}
System.out.println();

结果如下:
java小白学习记录:冒泡排序和选择排序_第4张图片

对比这两个方法,我们发现两个方法比较的次数是一样的,只是选择排序值交换的次数比较少。

你可能感兴趣的:(java)