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

时间久了,连基本的排序算法都忘记了。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、快速排序

 

posted @ 2022-07-03 15:26  心动如雷  阅读(21)  评论(0编辑  收藏  举报