当前位置: 首页 > news >正文

30分钟编写十大排序算法完成

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;//排序算法
public class test_04_22 {public static void swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}//冒泡排序-稳定public static void test1(int[] nums){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]){swap(nums, j, j+1);}}}}//选择排序 每次选择最小的放入i的位置-不稳定public static void test2(int[] nums){for (int i=0;i<nums.length;i++){int minIndex = i;for (int j=i;j<nums.length;j++){if (nums[j]<nums[minIndex]){minIndex=j;}}if (minIndex!=i){swap(nums,minIndex,i);}}}//直接插入排序-稳定public static void test3(int[] nums){//假设前面是有序的for (int i=1;i<nums.length;i++){int target = nums[i];int j=i-1;for (;j>=0;j--){if (target<nums[j]){nums[j+1]=nums[j];}else{break;}}nums[j+1]=target;}}//希尔排序-不稳定public static void test4(int[] nums){int n = nums.length;for (int step=n/2;step>=1;step=step/2){for (int i=step;i<n;i++){int temp = nums[i];int j=i-step;for (;j>=0;j-=step){if (temp<nums[j]){nums[j+step]=nums[j];}else{break;}}nums[j+step]=temp;}}}//7 4 8//快速排序-不稳定public static void test5(int[] nums, int left, int right){if (left>=right){return;}int temp=nums[left];int i=left;int j=right;while (i<=j){if (nums[i]<=temp){i++;}else if (nums[j]>=temp){j--;}else{swap(nums,i++,j--);}}//将获取到的中间位置进行交换1nums[left]=nums[j];nums[j]=temp;test5(nums,left,j-1);test5(nums,j+1,right);}//归并排序-稳定public static int[] test6(int[] nums, int left, int right){if (left>=right){return new int[]{nums[left]};}int mid = (left+right)/2;int[] leftNum = test6(nums, left, mid);int[] rightNum = test6(nums, mid + 1, right);return merge(leftNum, rightNum);}private static int[] merge(int[] leftNum, int[] rightNum) {int[] newNums = new int[leftNum.length+rightNum.length];int i=0;int j=0;int k=0;while (i<leftNum.length&&j<rightNum.length){if (leftNum[i]<rightNum[j]){newNums[k++]=leftNum[i++];}else{newNums[k++]=rightNum[j++];}}while (i<leftNum.length){newNums[k++]=leftNum[i++];}while (j<rightNum.length){newNums[k++]=rightNum[j++];}return newNums;}//堆排序-不稳定public static void test7(int[] nums){int n = nums.length;//建立堆for (int i=n/2-1;i>=0;i--){operateK(nums,n,i);}//开始调整for (int i=0;i<n-1;i++){swap(nums, 0,n-i-1);//调整 此时为n-1个节点operateK(nums,n-i-1,0);}}//[7,4,8,9]public static void operateK(int[] nums, int n, int k){while (k<n/2){int largeIndex = k*2+1;if (k*2+2<n&&nums[k*2+2]>nums[largeIndex]){largeIndex=k*2+2;}if (nums[largeIndex]<=nums[k]){break;}swap(nums,largeIndex,k);k=largeIndex;}}//计数排序-稳定public static void test8(int[] nums){int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int num : nums) {if (num < min) {min = num;}if (num > max) {max = num;}}int temp=0;if (min<0){temp=-min;}int[] newNums = new int[max+temp+1];for (int num : nums) {newNums[num + temp]++;}int k=0;//获取for (int i=0;i<newNums.length;i++){while (newNums[i]>0){nums[k++]=i-temp;newNums[i]--;}}System.out.println(Arrays.toString(nums));}////12 7 888//基数排序-稳定public static void test9(int[] nums){int max=Integer.MIN_VALUE;for (int num:nums){if (num>max){max=num;}}int i=0;//123//求出其的每一位while (max>0){radixSort(nums,i);i++;max=max/10;}}public static void radixSort(int[] nums, int k) {for (int i=0;i<nums.length-1;i++){for (int j=0;j<nums.length-i-1;j++){int m = k>=(nums[j]+"").length()?0:((nums[j]+"").charAt((nums[j]+"").length()-k-1)-48);int n = k>=(nums[j+1]+"").length()?0:((nums[j+1]+"").charAt((nums[j+1]+"").length()-k-1)-48);if (m>n){swap(nums,j,j+1);}}}}//桶排序-稳定public static void test10(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 bucketNum = 10;//保证一定装够int bucketSize = (max-min)/bucketNum+1;List<List<Integer>> ls = new ArrayList<>();for (int i=0;i<bucketNum;i++){ls.add(new ArrayList<>());}for (int num : nums) {int index = (num - min) / bucketSize;ls.get(index).add(num);}int k=0;for (List<Integer> l : ls) {Collections.sort(l);for (Integer integer : l) {nums[k++] = integer;}}}public static void main(String[] args) {int[] nums = {7,4,8,9,3,2,4,4,2};test10(nums);System.out.println(Arrays.toString(nums));}
}

相关文章:

  • NumPy入门:从数组基础到数学运算
  • Redis ⑤-单线程模型 | 常用数据结构
  • 【SAP-CO】成本主数据
  • UWB定位技术在钢铁厂行业中的创新应用与价值实践
  • 代理设计模式:从底层原理到源代码 详解
  • 物理机检查磁盘坏道方式
  • prtobuf的原理
  • 【Luogu】动态规划一
  • TS-300B浊度传感器详解(STM32)
  • STM32单片机入门学习——第46节: [14-1] WDG看门狗
  • Redis在.NET平台中的各种应用场景
  • AI日报 - 2025年4月23日
  • 代理模式(Proxy Pattern)详解:以延迟加载图片为例
  • NLP高频面试题(五十)——大模型(LLMs)分词(Tokenizer)详解
  • 【C++】Json-Rpc框架项目介绍(1)
  • Agent框架LangGraph:实现一个简单的Plan-and-Execute Agent
  • 电子电器架构 --- 面向下一代车辆的演进式(发展演变的)汽车网关
  • 仅追加KV数据库
  • 实验一 进程控制实验
  • 2023蓝帽杯初赛内存取证-4
  • 视频丨习近平同阿塞拜疆总统会谈:两国建立全面战略伙伴关系
  • 最高检:去年共受理审查逮捕侵犯知识产权犯罪13486人
  • 内蒙古已评出280名“担当作为好干部”,186人提拔或晋升
  • 2025年上海车展后天开幕,所有进境展品已完成通关手续
  • 中保协:当前普通型人身保险产品预定利率研究值为2.13%
  • 江西省人大教育科学文化卫生委员会主任委员王水平被查