• 常见排序算法整理(冒泡、选择、插入、堆等)


    时间久了,连基本的排序算法都忘记了。java实现并回顾一下。

    1、排序基础类

     1 package com.wangymd.sort;
     2 
     3 /**
     4  * @desc 排序
     5  * @author wangymd
     6  * @data 2022-06-28 19:48:15
     7  */
     8 public abstract class BaseSort {
     9     
    10     /**
    11      * 打印排序后的数组
    12      * @param nums
    13      */
    14     public static void printNums(String prefix, int[] nums) {
    15         System.out.print(prefix + ":[");
    16         for (int i = 0; i < nums.length; i++) {
    17             if(i == nums.length - 1) {
    18                 System.out.print(nums[i] + "]");
    19                 break;
    20             }
    21             System.out.print(nums[i] + ",");
    22         }
    23     }
    24 }
    View Code

    2、冒泡排序

     1 package com.wangymd.sort;
     2 
     3 /**
     4  * @desc 冒泡排序:从序列邮编开始比较相邻两个数字的大小,在根据结果交换两个数字的位置。 O(n^2)
     5  * @author wangymd
     6  * @data 2022-06-28 19:48:15
     7  */
     8 public class BubbleSort extends BaseSort{
     9     
    10     /**
    11      * 最小值左移
    12      * @param nums
    13      * @return
    14      */
    15     public int[] sort1(int[] nums) {
    16         if(nums == null || nums.length <= 0) {
    17             return nums;
    18         }
    19         //外循环代表左侧已排序
    20         for (int i = 0; i < nums.length - 1; i++) {
    21             //内循环每次从右侧
    22             for (int j = nums.length - 1; j > i; j--) {
    23                 System.out.println("i:" + i + ",j:" + j);
    24                 if(nums[j] < nums[j - 1]) {
    25                     int temp = nums[j];
    26                     nums[j] = nums[j - 1];
    27                     nums[j - 1] = temp;
    28                 }
    29             }
    30         }
    31         return nums;
    32     }
    33     
    34     /**
    35      * 冒泡排序:最大值右移
    36      * @param nums
    37      * @return
    38      */
    39     public int[] sort2(int[] nums) {
    40         if(nums == null || nums.length <= 0) {
    41             return nums;
    42         }
    43         
    44         //外循环代表右侧已排序
    45         for (int i = nums.length - 1; i > 0; i--) {
    46             //内循环每次从左侧
    47             for (int j = 0; j < i; j++) {
    48                 System.out.println("i:" + i + ",j:" + j);
    49                 if(nums[j] > nums[j + 1]) {
    50                     int temp = nums[j];
    51                     nums[j] = nums[j + 1];
    52                     nums[j + 1] = temp;
    53                 }
    54             }
    55         }
    56         return nums;
    57     }
    58     
    59     /**
    60      * @param args
    61      */
    62     public static void main(String[] args) {
    63         int[] nums = new int[]{5, 9, 3, 1, 2, 8, 4, 7, 6};
    64         
    65         BubbleSort sortTest = new BubbleSort();
    66         
    67         printNums("排序前nums", nums);
    68         printNums("sort1排序后nums", sortTest.sort1(nums));
    69         
    70         System.out.println("##############################");
    71         nums = new int[]{5, 9, 3, 1, 2, 8, 4, 7, 6};
    72         printNums("排序前nums", nums);
    73         printNums("sort2排序后nums", sortTest.sort2(nums));
    74     }
    75 }
    View Code

    3、选择排序

    package com.wangymd.sort;
    
    /**
     * @desc 选择排序:从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换。 O(n^2)
     * @author wangymd
     * @data 2022-06-28 19:48:15
     */
    public class SelectSort extends BaseSort{
        
        /**
         * 升序
         * @param nums
         * @return
         */
        public int[] sort1(int[] nums) {
            if(nums == null || nums.length <= 0) {
                return nums;
            }
            
            for (int i = 0; i < nums.length - 1; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    System.out.println("i:" + i + ",j:" + j);
                    if(nums[j] < nums[i]) {
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                    }
                }
            }
            return nums;
        }
        
        /**
         * 降序
         * @param nums
         * @return
         */
        public int[] sort2(int[] nums) {
            if(nums == null || nums.length <= 0) {
                return nums;
            }
            
            for (int i = 0; i < nums.length - 1; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    System.out.println("i:" + i + ",j:" + j);
                    if(nums[j] > nums[i]) {
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                    }
                }
            }
            return nums;
        }
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            int[] nums = new int[]{5, 9, 3, 1, 2, 8, 4, 7, 6};
            
            SelectSort sortTest = new SelectSort();
            printNums("排序前nums", nums);
            printNums("sort1排序后nums", sortTest.sort1(nums));
            
            System.out.println("##############################");
            printNums("排序前nums", nums);
            printNums("sort2排序后nums", sortTest.sort2(nums));
        }
    }
    View Code

    4、插入排序

     1 package com.wangymd.sort;
     2 
     3 /**
     4  * @desc 插入排序:从右侧的未排序区域内取出一个数据,让后将他插入到已排序区域内合适位置, O(n^2)
     5  * @author wangymd
     6  * @data 2022-06-28 19:48:15
     7  */
     8 public class InsertSort extends BaseSort{
     9     
    10     /**
    11      * 升序
    12      * @param nums
    13      * @return
    14      */
    15     public int[] sort1(int[] nums) {
    16         if(nums == null || nums.length <= 0) {
    17             return nums;
    18         }
    19         
    20         //左侧序列已排序
    21         for (int i = 0; i < nums.length - 1; i++) {
    22             for (int j = i + 1; j > 0; j--) {
    23                 System.out.println("i:" + i + ",j:" + j);
    24                 if(nums[j - 1] <= nums[j]) {
    25                     break;
    26                 }
    27                 int temp = nums[j];
    28                 nums[j] = nums[j - 1];
    29                 nums[j - 1] = temp;
    30             }
    31         }
    32         return nums;
    33     }
    34     
    35     /**
    36      * 降序
    37      * @param nums
    38      * @return
    39      */
    40     public int[] sort2(int[] nums) {
    41         if(nums == null || nums.length <= 0) {
    42             return nums;
    43         }
    44         
    45         //左侧序列已排序
    46         for (int i = 0; i < nums.length - 1; i++) {
    47             for (int j = i + 1; j > 0; j--) {
    48                 System.out.println("i:" + i + ",j:" + j);
    49                 if(nums[j - 1] >= nums[j]) {
    50                     break;
    51                 }
    52                 int temp = nums[j];
    53                 nums[j] = nums[j - 1];
    54                 nums[j - 1] = temp;
    55             }
    56         }
    57         return nums;
    58     }
    59     
    60     /**
    61      * @param args
    62      */
    63     public static void main(String[] args) {
    64         int[] nums = new int[]{5, 9, 3, 1, 2, 8, 4, 7, 6};
    65         
    66         InsertSort sortTest = new InsertSort();
    67         printNums("排序前nums", nums);
    68         printNums("sort1排序后nums", sortTest.sort1(nums));
    69         
    70         System.out.println("##############################");
    71         printNums("排序前nums", nums);
    72         printNums("sort2排序后nums", sortTest.sort2(nums));
    73     }
    74 }
    View Code

    5、堆排序

     参考我的堆java实现:https://www.cnblogs.com/wangymd/p/16439887.html

    6、归并排序

    7、快速排序

  • 相关阅读:
    安装Python 3.6 在Ubuntu 16.04 LTS 版本
    [leetcode]447. Number of Boomerangs
    【leetcode】443. String Compression
    第7课 课堂学习小问答
    第11章 进程间通信(4)_进程信号量
    第11章 进程间通信(3)_共享内存
    第11章 进程间通信(2)_消息队列
    第11章 进程间通信(1)_管道
    第10章 线程控制(5)_多线程下的fork
    第10章 线程控制(4)_多线程下的信号
  • 原文地址:https://www.cnblogs.com/wangymd/p/16420833.html
Copyright © 2020-2023  润新知