SortAlgorithm.java

import java.util.*;class SortAlgorithm {
//冒泡排序public int[] BubbleSort(int[] nums){int n=nums.length;for (int i = 0; i < n; i++) {for (int j = 0; j < n-i-1; j++) {if(nums[j]>nums[j+1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;}}}return nums;
}//选择排序public int[] SelectSort(int[] nums){int n = nums.length;for (int i = 0; i < n - 1; i++) {int min = i;for (int j = i + 1; j < n; j++) {if(nums[min] > nums[j]) min = j;}//交换int temp = nums[i];nums[i] = nums[min];nums[min] = temp;}return nums;}//插入排序public int[] InsertSort(int[] nums){for(int i=1; i<nums.length; i++){for(int j=i; j>0; j--){if(nums[j]<nums[j-1]){int temp = nums[j-1];nums[j-1] = nums[j];nums[j] = temp;}}}return nums;}
//希尔排序
/* 希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,
要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,
则需要与相邻元素交换很多次才能到达正确的位置,这样是相对比较花时间了。
希尔排序就是为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序。
希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,
接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。 */public int[] shellSort(int nums[]) {int n = nums.length;// 对每组间隔为 h的分组进行排序,刚开始 h = n / 2;for (int h = n / 2; h > 0; h /= 2) {//对各个局部分组进行插入排序for (int i = h; i < n; i++) {// nums[i] 插入到所在分组的正确位置上int k;int temp = nums[i];for (k = i - h; k > 0 && temp < nums[k]; k -= h) {nums[k + h] = nums[k];}nums[k + h] = temp;}}return nums;}//归并排序
public int[] mergeSort(int nums[],int left,int right) {if (left < right) {int mid=(left+right)/2;//左半部分排序mergeSort(nums, left, mid);//右半部分排序mergeSort(nums, mid+1, right);//进行合并merge(nums,left,mid,right);}return nums;
}
public void merge(int nums[],int left,int mid,int right){//辅助数组int[] a=new int[right-left+1];int i=left;int j=mid+1;int k=0;while(i<=mid&&j<=right){if(nums[i]<nums[j]){a[k++]=nums[i++];}else{a[k++]=nums[j++];}}//如果第一个序列未检测完,直接将后面所有元素加到合并的序列中while(i<=mid){a[k++]=nums[i++];}while(j<=right){a[k++]=nums[j++];}//复制回原数组for(i=0;i<k;i++){nums[left++]=a[i];}
}//快速排序public int[] quickSort(int nums[],int left,int right) {if(left<right){int mid=partition(nums,left,right);nums=quickSort(nums, left, mid-1);nums=quickSort(nums, mid+1, right);}return nums;}private int partition(int[] nums,int left,int right){int pivot=nums[left];int i=left+1;int j=right;while(true){//向右找到第一个小于pivot的位置while(i<=j&&nums[i]<=pivot) i++;//向左找到第一个大于pivot的位置while(i<=j&&nums[j]>=pivot) j--;if(i>=j){break;}int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}nums[left]=nums[j];nums[j]=pivot;return j;}//堆排序public int[] headSort(int[] nums){int n= nums.length;//构建大顶堆for(int i=(n-2)/2;i>=0;i--){downAdjust(nums,i,n-1);}//进行堆排序for(int i=n-1;i>=1;i--){//把堆顶元素与最后一个元素交换int temp =nums[i];nums[i]=nums[0];nums[0]=temp;//把打乱的堆进行调整,恢复堆的特性downAdjust(nums, 0, i-1);}return nums;}public void downAdjust(int[] nums, int parent,int n){//临时保存要下沉的元素int temp =nums[parent];//定位左孩子节点的位置int child=2*parent+1;while(child<=n){//如果右孩子节点比左孩子大,则定位到右孩子if(child+1<=n&&nums[child]<nums[child+1]){child++;}//如果孩子节点小于或等于父节点,则下沉结束if(nums[child]<=temp) break;//父节点进行下沉nums[parent]=nums[child];parent=child;child=2*parent+1;}nums[parent]=temp;}//计数排序public int[] countSort(int[] nums) {if(nums == null || nums.length < 2) return nums;int n = nums.length;int min = nums[0];int max = nums[0];// 寻找数组的最大值与最小值for (int i = 1; i < n; i++) {if(max < nums[i])max = nums[i];if(min > nums[i])min = nums[i];}int d = max - min + 1;// 创建大小为max的临时数组int[] temp = new int[d];// 统计元素i出现的次数for (int i = 0; i < n; i++) {temp[nums[i] - min]++;}int k = 0;// 把临时数组统计好的数据汇总到原数组for (int i = 0; i < d; i++) {for (int j = temp[i]; j > 0; j--) {nums[k++] = i + min;}}return nums;}//桶排序public int[] BucketSort(int[] nums) {//1. 构造桶//1.1 确定桶的个数nint n = nums.length;//1.2 声明并初始化一个List,存放链表;List<ArrayList<Integer>> Blist = new ArrayList<>(n);//2.将数组中的元素放到桶中//2.1 确定元素的最值int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for(int a : nums){max = Math.max(max, a);min = Math.min(min, a);}//和优化版本的计数排序一样,弄一个大小为 min 的偏移值int d = max - min;//创建 d / 5 + 1 个桶,第 i 桶存放  5*i ~ 5*i+5-1范围的数int bucketNum = d / 5 + 1;for(int i = 0; i < n; i++)Blist.add(new ArrayList<Integer>(bucketNum));//确定每个元素放入桶的编号并放进去for(int i : nums){//确定桶的编号//加1是为了保证index< A.length,防止程序抛出IndexOutofBoundsEx;int index = (int)((i-min) / (max-min+1.0) * n); //放入对应的桶中Blist.get(index).add(i);}//3.桶内排序for(int i = 0; i < Blist.size(); i++){Collections.sort(Blist.get(i));}//4.合并数据int j = 0;for(ArrayList<Integer> arr : Blist){for(int i : arr){nums[j++] = i;}}return nums;}//基数排序public  int[] radioSort(int[] nums) {// 基数排序简化// 1.得到最大的位数int max = nums[0];// 假设最大数是第一个for (int i = 1; i < nums.length; i++) {if (nums[i] > max) {max = nums[i];}}// 得到最大数是几位数int maxLength = (max + "").length();// 定义一个二维数组,表示10个桶,每个桶就是一个一维数组// 说明// 1.二维数组包含10个一维数组// 2.为了防止数据溢出,则每个一维数组的大小定义为arr.lenght// 3.很明确,基数排序是用空间换时间的经典算法int[][] bucket = new int[10][nums.length];// 为了记录每个桶中实际存放了多少个数据,我们定义一个以为数组来记录各个桶中的每次放入的数据个数// 比如:bucketElementCounts[0]记录的就是bbucket[0]桶的放入数据个数int[] bucketElementCounts = new int[10];// 使用循环将代码处理for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// 排序(针对每一个元素的对应位进行排序处理),第一次 个位,第二次 十位,第三次 百位。。。。。。for (int j = 0; j < nums.length; j++) {// 取出每个元素对应位的数据int digitOfElement = nums[j] / n % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = nums[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)int index = 0;// 遍历每一个桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] != 0) {// 循环该桶,即第k个一维数组for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放到arrnums[index++] = bucket[k][l];}}// 每一轮处理后需要将每一个bucketElementCounts置0bucketElementCounts[k] = 0;}}return nums;}public static void main(String[] args) {SortAlgorithm sa=new SortAlgorithm();int[] nums={2,3,6,9,4,5};System.out.println(Arrays.toString(sa.BubbleSort(nums)));System.out.println(Arrays.toString(sa.SelectSort(nums)));System.out.println(Arrays.toString(sa.InsertSort(nums)));System.out.println(Arrays.toString(sa.shellSort(nums)));System.out.println(Arrays.toString(sa.mergeSort(nums,0,nums.length-1)));System.out.println(Arrays.toString(sa.quickSort(nums,0,nums.length-1)));System.out.println(Arrays.toString(sa.headSort(nums)));  System.out.println(Arrays.toString(sa.countSort(nums))); System.out.println(Arrays.toString(sa.BubbleSort(nums)));  System.out.println(Arrays.toString(sa.radioSort(nums)));     }
}

总结

用一张图汇总了10大排序算法的性质

十大排序算法代码集锦(java)相关推荐

  1. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  2. 十大排序算法(Java)

    文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...

  3. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  4. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...

    码农有道 历史文章目录(请戳我) 关于码农有道(请戳我) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强烈建议先收藏然后 ...

  5. 【C#】十大排序算法(动图演示+代码实现)

    文章目录 1.冒泡排序 2.插入排序 3.选择排序 4.快速排序 5.希尔排序 6.堆排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 参考 1.冒泡排序 口诀: 外层循环 n-1;内层循 ...

  6. 这或许是东半球分析十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...

  7. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

  8. 「归纳|总结」程序员必知必会的十大排序算法

    微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...

  9. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

最新文章

  1. 同源注释工具GeneWise安装和使用
  2. sqlalchemy安装以及使用_电子皮带秤的安装使用条件以及对输送机的要求
  3. 结对编程Wordcount
  4. 文件移到废纸篓,可是这个状态就卡住了
  5. Java8 中用法优雅的 Stream,性能也优雅吗?
  6. 关于机器学习,你应该至少学习这8个落地案例|干货集锦
  7. Apache CXF – JAX-WS –简单教程
  8. MySQL安全设置命令mysql_secure_installation
  9. 贵州农信凭证打印小程序_我的医保凭证小程序入口
  10. cmd安装mysql_MySQL windows下cmd安装操作
  11. 新技能 get —— 五笔打字
  12. 数字化营销的意义所在
  13. 博士申请 | 新西兰梅西大学王睿俐教授招收语音识别和NLP方向全奖博士生
  14. 图灵在计算机科学方面主要贡献,图灵在计算机理论方面的贡献
  15. 这一周我学习了什么(一)
  16. 网络口碑推广主要目的全知道
  17. servlet生命周期 1
  18. 邻居子系统之ARP协议数据处理过程
  19. PS4游戏将登陆PC:一曲属于主机的悲歌
  20. TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践

热门文章

  1. html table边框加粗,table加边框记录
  2. Niubility (分享一) Flink 在快手实时多维分析场景的应用
  3. RCLAMP0544T 国产替代上海雷卯ULC0544T
  4. Nutch安装第四天,进入正题,Nutch2.4的配置和编译
  5. 智能合约在衍生品上的应用_5种衍生品在您的机器学习面试中表现出色
  6. 华三交换机如何进入配置_H3C交换机恢复出厂和各种基本配置方法
  7. Mac 更新系统后无法正常启动
  8. 论文阅读笔记《Regularizing Dialogue Generation by Imitating Implicit Scenarios》
  9. CentOS7 下安装 MySQL5.7 (包含mysql安装报错处理)
  10. cornell grasp data 康奈尔大学抓取数据集 百度云