Java|Java 常见排序算法代码分享
目录
- 1. 冒泡排序
- 2. 选择排序
- 3. 插入排序
- 4. 快速排序
- 5. 归并排序
- 6. 希尔排序
- 6.1 希尔-冒泡排序(慢)
- 6.2 希尔-插入排序(快)
- 7. 堆排序
- 8. 计数排序
- 9. 桶排序
- 10. 基数排序
- 11. 使用集合或 API
- 11.1 优先队列
- 11.2 Java API
文章图片
1. 冒泡排序 每轮循环确定最值;
public void bubbleSort(int[] nums){int temp; boolean isSort = false; //优化,发现排序好就退出for (int i = 0; i < nums.length-1; i++) {for (int j = 0; j < nums.length-1-i; j++) {//每次排序后能确定较大值if(nums[j] > nums[j+1]){isSort = true; temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; }}if(!isSort){return; } else {isSort = false; }}}
2. 选择排序 每次选出最值,再交换到边上;
public void selectSort(int[] nums){for (int i = 0; i < nums.length-1; i++) {int index = i; int minNum = nums[i]; for (int j = i+1; j < nums.length; j++) {if(nums[j] < minNum){minNum = nums[j]; index = j; }}if(index != i){nums[index] = nums[i]; nums[i] = minNum; }}}
3. 插入排序
对循环的每个数找到属于自己的位置插入;
public void insertionSort(int[] nums){for (int i = 1; i < nums.length; i++) {int j = i; int insertNum = nums[i]; while(j-1 >= 0 && nums[j-1] > insertNum){nums[j] = nums[j-1]; j--; }nums[j] = insertNum; }}
4. 快速排序
选一个基本值,小于它的放一边,大于它的放另一边;
public void quickSortDfs(int[] nums, int left, int right){if(left > right){return; }int l = left; int r = right; int baseNum = nums[left]; while(l < r){//必须右边先走while(nums[r] >= baseNum && l < r){r--; }while(nums[l] <= baseNum && l < r){l++; }int temp = nums[l]; nums[l] = nums[r]; nums[r] = temp; }nums[left] = nums[l]; nums[l] = baseNum; quickSortDfs(nums, left, r-1); quickSortDfs(nums, l+1, right); }
5. 归并排序
分治算法;
//归public void mergeSortDfs(int[] nums, int l, int r){if(l >= r){return; }int m = (l+r)/2; mergeSortDfs(nums, l, m); mergeSortDfs(nums, m+1, r); merge(nums, l, m, r); }//并private void merge(int[] nums, int left, int mid, int right){int[] temp = new int[right-left+1]; int l = left; int m = mid+1; int i = 0; while(l <= mid && m <= right){if(nums[l] < nums[m]){temp[i++] = nums[l++]; } else {temp[i++] = nums[m++]; }}while(l <= mid){temp[i++] = nums[l++]; }while(m <= right){temp[i++] = nums[m++]; }System.arraycopy(temp, 0, nums, left, temp.length); }
6. 希尔排序
引入步长减少数字交换次数提高效率;
6.1 希尔-冒泡排序(慢)
public void shellBubbleSort(int[] nums){for (int step = nums.length/2; step > 0 ; step /= 2) {for (int i = step; i < nums.length; i++) {for (int j = i-step; j >= 0; j -= step) {if(nums[j] > nums[j+step]){int temp = nums[j]; nums[j] = nums[j+step]; nums[j+step] = temp; }}}}}
6.2 希尔-插入排序(快)
public void shellInsertSort(int[] nums){for (int step = nums.length/2; step > 0; step /= 2) {for (int i = step; i < nums.length; i++) {int j = i; int insertNum = nums[i]; while(j-step >= 0 && nums[j-step] > insertNum){nums[j] = nums[j-step]; j-=step; }nums[j] = insertNum; }}}
7. 堆排序
大顶堆实现升序,每次将最大值移到堆的最后一个位置上;
public void heapSort2(int[] nums) {for(int i = nums.length/2-1; i >= 0; i--){sift(nums, i, nums.length); }for (int i = nums.length-1; i > 0; i--) {int temp = nums[0]; nums[0] = nums[i]; nums[i] = temp; sift(nums, 0, i); }}private void sift(int[] nums, int parent, int len) {int value = https://www.it610.com/article/nums[parent]; for (int child = 2*parent +1; child < len; child = child*2 +1) {if(child+1 < len && nums[child+1]> nums[child]){child++; }if(nums[child] > value){nums[parent] = nums[child]; parent = child; } else {break; }}nums[parent] = value; }
8. 计数排序
按顺序统计每个数出现次数;
public void countSort(int[] nums){int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int num : nums){max = Math.max(max, num); min = Math.min(min, num); }int[] countMap = new int[max-min+1]; for(int num : nums){countMap[num-min]++; }int i = 0; int j = 0; while(i < nums.length && j < countMap.length){if(countMap[j] > 0){nums[i] = j+min; i++; countMap[j]--; } else {j++; }}}
9. 桶排序
类似计数排序,不同点在于统计的是某个区间(桶)里的数;
public void bucketSort(int[] nums){int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int num : nums){max = Math.max(max, num); min = Math.min(min, num); }int bucketCount = (max-min)/nums.length+1; List> bucketList = new ArrayList<>(); for (int i = 0; i < bucketCount; i++) {bucketList.add(new ArrayList<>()); }for(int num : nums){int index = (num-min)/nums.length; bucketList.get(index).add(num); }for(List
bucket : bucketList){Collections.sort(bucket); }int j = 0; for(List bucket : bucketList){for(int num : bucket){nums[j] = num; j++; }}}
10. 基数排序
按个、十、百位依次归类排序;
publicvoid radixSort(int[] nums){int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; for (int num : nums) {min = Math.min(min, num); max = Math.max(max, num); }for (int i = 0; i < nums.length; i++) {nums[i] -= min; }max -= min; int maxLen = (max+"").length(); int[][] bucket = new int[nums.length][10]; int[] bucketCount = new int[10]; for (int i = 0, n = 1; i < maxLen; i++, n*=10) {for (int num : nums) {int digitVal = num / n % 10; bucket[bucketCount[digitVal]][digitVal] = num; bucketCount[digitVal]++; }int index = 0; for (int j = 0; j < bucketCount.length; j++) {if(bucketCount[j] > 0){for (int k = 0; k < bucketCount[j]; k++) {nums[index] = bucket[k][j]; index++; }}bucketCount[j] = 0; }}for (int i = 0; i < nums.length; i++) {nums[i] += min; }}
11. 使用集合或 API 【Java|Java 常见排序算法代码分享】
11.1 优先队列
public void priorityQueueSort(int[] nums){PriorityQueuequeue = new PriorityQueue<>(); for(int num : nums){queue.offer(num); }for (int i = 0; i < nums.length; i++) {nums[i] = queue.poll(); }}
11.2 Java API
public void arraysApiSort(int[] nums){Arrays.sort(nums); }
到此这篇关于Java 常见排序算法代码分享的文章就介绍到这了,更多相关Java 常见排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Java线程池execute()方法源码全面解析
- java|Go 1.18 二进制文件的信息嵌入
- spring|java springboot前后端不分离项目
- java后台管理系统|java后台管理系统_基于 java的spring boot 和Vue ElementUI的在线考试后台管理系统
- 大数据项目总结|基于Java+springmvc+vue 健康管理系统
- Java毕业设计|基于Java+SpringMvc+vue+element实现博物馆平台系统
- java项目精品实战案例|基于Java+SpringMvc+vue+element实现驾校管理系统详细设计
- 剑指Offer之Java算法习题精讲数组查找与字符串交集
- 实例详解Java库中的LocalDate类
- java如何连接数据库executeUpdate()和executeQuery()