快速排序

代码实现

package Sort;import java.util.Arrays;//快速排序
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70};quick(arr,0, arr.length-1);System.out.println(Arrays.toString(arr));}//最左边和最右边的索引public static void quick(int[] arr,int left,int right){int l =left;int r = right;int pivot = arr[(r+l)/2];//中轴值int temp = 0;//while循环的目的是把比pivot小的值放在左边while (l<r){//在pivot左边一直找while (arr[l]<pivot){l++;//如果出现比中轴值大的情况,下标就会卡在这里}while (arr[r]>pivot){r--;}if (l>=r){//如果此条件成立,说明pivot左边的值全是小于等于、右边全是大于等于pivot的值break;}//交换temp=arr[l];arr[l]=arr[r];arr[r]=temp;//可能中间会有若干个值相同的元素,需要--前移一次再做判断,否则会死循环if (arr[l]==pivot){r--;}if (arr[r]==pivot){l++;}}//如果l==r,必须r--,l++,否则会出现栈溢出if (l==r){r--;l++;}//左递归if (left<r){quick(arr,left,r);}//右递归if (right>l){quick(arr,l,right);}}
}

代码实现

package Sort;import java.util.Arrays;//归并排序
public class MergeSort {public static void main(String[] args) {int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};int[] temp = new int[arr.length];mergeSort1(arr,0,arr.length - 1,temp);System.out.println(Arrays.toString(arr));}//分+合方法public static void mergeSort1(int[] arr, int left, int right, int[] temp) {if (left < right) {//分到二者重合,即只剩一个数int mid = (left + right)/2;//向左递归进行分解mergeSort1(arr, left, mid, temp);//右递归mergeSort1(arr, mid + 1, right, temp);//到合并merge(arr, left, mid, right, temp);}}//合并的方法/*** @param arr   原始数组* @param left  初始索引* @param mid   中间索引* @param right 右边索引* @param temp  做中转的数组*/public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;int j = mid + 1;int t = 0;//临时数组的当前索引//先把左右两边这2个有序数组按规则填充到temp数组中,直到一方处理完毕while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[t] = arr[i];t+=1;i++;} else {temp[t] = arr[j];t+=1;j++;}}//另一方将剩余的元素全部填入temp中while (i<=mid){temp[t]=arr[i];t+=1;i++;}while (j<=right){temp[t]=arr[j];t+=1;j++;}//将temp数组中的元素拷贝到arr//注:不是每次都拷贝所有t=0;int tempLeft=left;while (tempLeft<=right){//第一次合并tempLeft=0,right=1arr[tempLeft]=temp[t];t++;tempLeft++;}}
}

package Sort;import java.util.Arrays;//桶排序
public class RadixSort {public static void main(String[] args) {int[] arr = {53, 3, 542, 748, 14, 214};radix(arr);System.out.println(Arrays.toString(arr));}public static void radix(int[] arr) {//得到数组中最大数的位数int max = arr[0];for (int m = 1; m < arr.length; m++) {if (arr[m] > max) {max = arr[m];}}int maxLength = (max + "").length();//定义一个二维数组,表示10个桶,每个桶代表一个一维数组//为了防止数组的数据溢出,每个桶的大小定义为arr.length//因此,桶排序是空间换时间的经典算法int[][] bucket = new int[10][arr.length];//为了记录每个桶中实际存放了多少数据,定义一个一维数组int[] eleCounts = new int[10];for (int n = 0, o = 1; n < maxLength; n++,o*=10) {for (int j = 0; j < arr.length; j++) {int digitEle = arr[j] / o % 10;//放入对应的桶bucket[digitEle][eleCounts[digitEle]] = arr[j];//对应桶数据个数+1eleCounts[digitEle]++;}//按照桶的顺序把数据取回来int index = 0;//外层遍历桶、内层遍历桶里的数据for (int i = 0; i < eleCounts.length; i++) {//就是10if (eleCounts[i] != 0) {for (int j = 0; j < eleCounts[i]; j++) {arr[index] = bucket[i][j];index++;}}//重要:一轮结束后,要将计数数组中对应的数据数量重置eleCounts[i] = 0;}}//        //第一轮(针对个位)
//        //定义一个二维数组,表示10个桶,每个桶代表一个一维数组
//        //为了防止数组的数据溢出,每个桶的大小定义为arr.length
//        //因此,桶排序是空间换时间的经典算法
//        int[][] bucket = new int[10][arr.length];
//        //为了记录每个桶中实际存放了多少数据,定义一个一维数组
//        int[] eleCounts = new int[10];
//        for (int j = 0; j < arr.length; j++) {//            int digitEle = arr[j] % 10;//个位
//            //放入对应的桶
//            bucket[digitEle][eleCounts[digitEle]]=arr[j];
//            //对应桶数据个数+1
//            eleCounts[digitEle]++;
//
//        }
//        //按照桶的顺序把数据取回来
//        int index = 0;
//        //外层遍历桶、内层遍历桶里的数据
//        for (int i = 0; i < eleCounts.length; i++) {//就是10
//            if (eleCounts[i]!=0){//                for (int j = 0; j < eleCounts[i]; j++) {//                    arr[index]=bucket[i][j];
//                    index++;
//                }
//            }
//        }}
}

高龄白菜java学习第八十九天(java数据结构和算法(10))相关推荐

  1. 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题

    foreach语句使用总结 增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对 ...

  2. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  3. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  4. Java学习笔记二十二:Java的方法重写

    Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...

  5. JAVA学习(八):JAVA文件编程

    本博文主要介绍JAVA文件编程,主要包括通过JDK提供的I/O来从文件读取和写入数据.字节流读写文件的方法.字符流读写文件的方法.如何使用File类创建.删除和遍历文件与目录等操作. 不管是C/C++ ...

  6. JavaScript学习(八十九)—数组练习题

    JavaScript学习(八十九)-数组练习题

  7. JavaScript学习(八十八)—数组知识点总结,超详细!!!

    JavaScript学习(八十八)-爆肝 数组知识点总结,超详细!!! 每天都要进步一点点 小王加油!!! 一.数组的概念 所谓数组就是指内存中开辟出来的用来存储大量数据的连续的存储空间 数组可以把一 ...

  8. JavaScript学习(八十六)—运算符知识点总结

    JavaScript学习(八十六)-运算符知识点总结 一. 运算符的分类 运算符(operator)也被称为操作符,是用于实现赋值.比较和执行算数运算等功能的符号. JavaScript中常用的运算符 ...

  9. JavaScript学习(八十五)—数据类型的转换

    JavaScript学习(八十五)-数据类型的转换 一.什么是数据类型的转换? 简单来说,就是把一种数据类型的变量转化为另外一种数据类型 二.转化为字符串类型 //把数字转化为字符串 变量.toStr ...

最新文章

  1. ubuntu安装mysql远程_Ubuntu18.04下远程安装MySQL
  2. 基类与派生类之间的转换关系
  3. Nginx全局块的其他配置指令
  4. linux监控脚本是否运行状态,Linux Shell脚本之通过json判断应用程序内部运行状态...
  5. 大剧院自助签证_剧院集团通过像开放组织一样取得成功
  6. 老虎ji 剪枝模拟
  7. Java基础:继承的综合案例 —— 群主发普通红包
  8. 【洛谷P3366】最小生成树(kruskal模版题+prim链式加边)
  9. promise入门的准备工作-(尚硅谷教程笔记)
  10. HTML编辑器-HTML网页表单可视化在线编辑器插件大全
  11. 12款高质量的免费 HTML 网站模板下载
  12. 提高计算机启动速度的是什么,电脑怎么提高开机速度?几个提高开机速度的各项优化...
  13. 应用程序界面开发 - 自定义用户控件布局控件的使用
  14. 无线网服务器亮红灯什么情况,无线网猫光信号闪红灯是什么原因
  15. webserver有哪些?
  16. 集成学习(二)——Bagging
  17. android广播监听短信并显示内容
  18. iOS 打开本地或下载excel文件
  19. 查看 Windows 10 快捷键 占用 VSCode 多行编辑 ctrl alt uparrow
  20. 15本经典金融投资著作

热门文章

  1. linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...
  2. 重磅:万里汇WorldFirst电商账户取消最低提现金额限制!
  3. 使用CE分析扫雷游戏,找到雷数的内存地址,找到低中高级的棋盘范围,找出地雷和别的数字在内存中的表示形式,猜测布雷算法
  4. 切莫是计算机病毒,国家计算机病毒应急处理中心
  5. 误删win10应用商店 修复方法
  6. 顾盼花发鸿蒙歌词,吹梦到西洲(女生独唱版)(翻自 黄诗扶)歌词
  7. Intellij 插件 Mybatis log plugin
  8. [转贴]第九届中国国际软件博览会参评软件产品获奖名单揭晓(2005-6-28)
  9. 如何用HTML+CSS+JavaScript实现一个简单的电影网站页面
  10. [BEV] 学习笔记之Lift, Splat, Shoot