• 冒泡排序和选择排序


    冒泡排序

     1 package com.cxx.cebc;
     2 
     3 import java.util.Arrays;
     4 
     5 /*
     6  * 冒泡排序:
     7  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到最后一个元素,确定最大的
     8  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到次后个元素,确定第二二的
     9  *从 arr[0]起,前一个依次和后一个比,谁大谁放后面,直到次次后个元素,确定第三大的
    10  *..........
    11  * .........
    12  */
    13 public class BubblingSort {
    14     public static void main(String[] args) {
    15         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
    16 
    17         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
    18         sort(arr);
    19         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
    20     }
    21 
    22     /*
    23      * 冒泡排序算法
    24      */
    25     public static void sort(int[] arr) {
    26         //记录交换次数
    27         int count = 0;
    28         //外层for循环
    29         for (int i = 0; i < arr.length; i++) {
    30             //前后两数比较,满足条件则交换
    31             for (int j = 1; j < arr.length - i; j++) {
    32                 if (arr[j - 1] > arr[j]) {
    33                     arr[j] = arr[j - 1] + arr[j];
    34                     arr[j - 1] = arr[j] - arr[j - 1];
    35                     arr[j] = arr[j] - arr[j - 1];
    36                     count++;
    37                     System.out.println(Arrays.toString(arr) + " 正在排序中.........");
    38                 }
    39             }
    40         }
    41         System.out.println("排序后的数组:" + Arrays.toString(arr) + "
     排序次数:" + count);
    42     }
    43 }

    执行结果

    [6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
    [1, 6, 2, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 3, 9, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 3, 4, 9, 5, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 3, 4, 5, 9, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 3, 4, 5, 9, 8, 10] 正在排序中.........
    [1, 2, 6, 3, 7, 4, 5, 9, 8, 10] 正在排序中.........
    [1, 2, 6, 3, 4, 7, 5, 9, 8, 10] 正在排序中.........
    [1, 2, 6, 3, 4, 5, 7, 9, 8, 10] 正在排序中.........
    [1, 2, 6, 3, 4, 5, 7, 8, 9, 10] 正在排序中.........
    [1, 2, 3, 6, 4, 5, 7, 8, 9, 10] 正在排序中.........
    [1, 2, 3, 4, 6, 5, 7, 8, 9, 10] 正在排序中.........
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
    排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     排序次数:13
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

    优化后的冒泡排序

     1 package com.cxx.cebc;
     2 
     3 import java.util.Arrays;
     4 
     5 public class OptimizeBubblingSort {
     6     public static void main(String[] args) {
     7         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
     8 
     9         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
    10         sort(arr);
    11         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
    12     }
    13 
    14     /*
    15      * 冒泡排序算法
    16      */
    17     public static void sort(int[] arr) {
    18         //记录交换次数
    19         int count = 0;
    20         //外层for循环
    21         for (int i = 0; i < arr.length; i++) {
    22             //记录下最大数的下标,默认当前序列尾部元素最大
    23             int index = arr.length - 1 - i;
    24             //查找当前序列真实的最大的数下标
    25             for (int j = 1; j < arr.length - i; j++) {
    26                 if (arr[j - 1] > arr[index]) {
    27                     index = j - 1;
    28                 }
    29             }
    30             //如果不是尾部元素最大,则交换并记录交换次数
    31             if (index != arr.length - 1 - i) {
    32                 arr[arr.length - 1 - i] = arr[index] + arr[arr.length - 1 - i];
    33                 arr[index] = arr[arr.length - 1 - i] - arr[index];
    34                 arr[arr.length - 1 - i] = arr[arr.length - 1 - i] - arr[index];
    35                 count++;
    36                 System.out.println(Arrays.toString(arr) + " 正在排序中.........");
    37             }
    38         }
    39         System.out.println("排序次数:" + count);
    40     }
    41 }

    执行结果

    [6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
    [6, 1, 2, 7, 9, 3, 4, 5, 8, 10] 正在排序中.........
    [6, 1, 2, 7, 8, 3, 4, 5, 9, 10] 正在排序中.........
    [6, 1, 2, 7, 5, 3, 4, 8, 9, 10] 正在排序中.........
    [6, 1, 2, 4, 5, 3, 7, 8, 9, 10] 正在排序中.........
    [3, 1, 2, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
    [2, 1, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
    排序次数:7
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

    选择排序

     1 package com.cxx.cebc;
     2 
     3 import org.junit.Test;
     4 
     5 import java.util.Arrays;
     6 
     7 /*
     8  * 选择排序:
     9  * arr[0]依次和arr[1]...arr[arr.length-1]比较,记录下最小的数,与arr[0]交换位置
    10  * arr[1]依次和arr[2]...arr[arr.length-1]比较,记录下最小的数,与arr[1]交换位置
    11  * arr[2]依次和arr[3]...arr[arr.length-1]比较,记录下最小的数,与arr[2]交换位置
    12  * .........
    13  *
    14  * .........
    15  */
    16 public class SelectionSort {
    17     public static void main(String[] args) {
    18         int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
    19 
    20         System.out.println(Arrays.toString(arr) + " 原始数据。。。。。");
    21         sort(arr);
    22         System.out.println(Arrays.toString(arr) + "排序完成。。。。。。");
    23     }
    24 
    25     /*
    26      * 选择排序算法
    27      */
    28     @Test
    29     public static void sort(int[] arr) {
    30         //记录交换次数
    31         int count = 0;
    32         //外层循环
    33         for (int i = 0; i < arr.length; i++) {
    34             //记录最小的元素下标,默认头部元素最小
    35             int index = i;
    36             //查找当前序列中最小的元素下标
    37             for (int j = i + 1; j < arr.length; j++) {
    38                 if (arr[j] < arr[index]) {
    39                     index = j;
    40                 }
    41             }
    42             //如果不是头部元素最小,则交换并记录交换次数
    43             if (index != i) {
    44                 arr[index] = arr[index] + arr[i];
    45                 arr[i] = arr[index] - arr[i];
    46                 arr[index] = arr[index] - arr[i];
    47                 count++;
    48                 System.out.println(Arrays.toString(arr) + " 正在排序中.........");
    49             }
    50 
    51         }
    52         System.out.println("排序次数:" + count);
    53     }
    54 
    55 }

    执行结果

    [6, 1, 2, 7, 9, 3, 4, 5, 10, 8] 原始数据。。。。。
    [1, 6, 2, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 6, 7, 9, 3, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 3, 7, 9, 6, 4, 5, 10, 8] 正在排序中.........
    [1, 2, 3, 4, 9, 6, 7, 5, 10, 8] 正在排序中.........
    [1, 2, 3, 4, 5, 6, 7, 9, 10, 8] 正在排序中.........
    [1, 2, 3, 4, 5, 6, 7, 8, 10, 9] 正在排序中.........
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 正在排序中.........
    排序次数:7
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]排序完成。。。。。。

    对比总结


    1、冒泡排序是相邻两个数比,这两个比较的数一致在向右移动,选择排序是固定一个位置的数和其后的数比,只
    有一个数在移动。优化过后的冒泡排序实际上就是选择排序。

    2、对于数组从小到大排序
    冒泡排序第X趟下来确定第X大的元素,放在数组的倒数第X个位置
    选择排序第X趟下来确定第X小的元素,放在数组的顺数第X个位置

    冒泡排序一趟会交换很多次,是稳定的。
    选择排序一趟只交换一次,是不稳定的。
    稳定和不稳定:
    比如对于数组5,6,2,8,1
    原本5,6顺序符合要求,但选择排序第一趟下来,2和5交换位置,5,6的从小到大顺序比打乱这就是不稳定。
    而对于选择排序,则不会出现打乱已有的满足条件的顺序,是稳定的。
    稳不稳定其实取决于一趟交换几次,交换一次肯定不稳定,优化过后的冒泡排序交换一次,不稳定。

  • 相关阅读:
    计算机组成原理1.1.1 课程简介
    【Mybatis】配置文件加载属性
    【Maven】项目中没有resources目录
    C语言指针(三)指针传递给函数
    C语言指针(二)指向指针的指针
    C语言指针(一)
    cygwin环境c语言开发
    【Centos7】安装nginx
    【Linux】管理在线用户
    【总结】偏序/数点
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/14682992.html
Copyright © 2020-2023  润新知