时间久了,连基本的排序算法都忘记了。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 }
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 }
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)); } }
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 }
5、堆排序
参考我的堆java实现:https://www.cnblogs.com/wangymd/p/16439887.html