Java排序算法之冒泡、选择、插入、快速
JavaSort
Java经典排序算法代码
2018-1-26更新:冒泡排序,选择排序,插入排序,快速排序
1. 冒泡排序
- 特点:效率低,实现简单
- 思想(从小到大排): 第1个数和第2个数比较,如果第1个数比第2个数小,则不动,如果第1个比第2个大,则交换。再比较第2个和第3个,如果第2个数比3个数小,则不动,如果第2个比第3个大,则交换。以此类推往后进行比较。一趟结束后,最大的数应该在最后一个(也可从后往前排)
public static void bubbleSort(int arr[]) {
for(int i=0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2. 选择排序
- 特点:效率低,容易实现。
- 第一趟->第一个数和后面的数依次比较,大就换,小就不动,第一趟结束,第一个数为最小的数。第二趟->第二个数和后面的数依次比较,大就换,小就不动,第二趟结束,第二个数为第二小的数。
- 参考文章:https://www.cnblogs.com/shen-hua/p/5424059.html
public static void selectSort(int arr[]) {
for(int i=0;i<arr.length-1;i++) {
for(int j=i+1;j<arr.length;j++) {
if(arr[i]>arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
3. 插入排序
- 特点:效率低,容易实现。
- 分而治之的思想。就是把一串数字分成有序和无序的两部分。比如 8 3 2 5,首先把8看成有序(他就一个数,当然有序),然后 3 2 5就是无序的部分,再把3 2 5 中的 3 拿出来作为有序的部分 和 之前排好的有序部分 8 进行比较,发现 3 比 8 小,交换 现在排好的有序部分为 3 8,剩下的无序部分为 2 5 ,在剩下无序部分中把 2 看成有序,和排好的 3 8 依次比较,发现比3 小 ,交换 ,现在左边排好的是 2 3 8 ,还剩一个5.继续依次和排好的比较,2 比 5小,不交换,3 比 5 小不交换, 8 比5 大,交换,所以新的数组 2 3 5 8。
- 参考文章:https://www.cnblogs.com/loveyoume/p/6261941.html
public static void insertSort(int arr[]) {
for(int i=1;i<arr.length;i++) {
for(int j=i-1;j>=0;j--) {
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
4. 快速排序
- 特点:高效,时间复杂度为nlogn。
- 思想:设置2个指针low指向第一个数,指针high指向最后一个数,high从后往前找,和low的数比较,如果high的数比low的数小,交换.此时high不动,low从前往后找,找到一个数比high大,交换,直到low,high指向同一个数,结束第一次排序。
- 参考文章:http://blog.csdn.net/as02446418/article/details/47395867
public static void quickSort(int arr[],int low,int high) {
int start = low;
int end = high;
int key = arr[low];
if(end<start) {
return;
}
while(end>start) {
//从后往前比
while(end > start && arr[end] >= key) {//如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
end--;
if(arr[end]<=key) {
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
}
//从前往后比
while(end > start && arr[start]<=key) {//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
start++;
if(arr[start]>=key) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
//此时第一次循环比较结束,关键值的位置已经确定了。
//左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
}
//递归
if(start>low) quickSort(arr,low,start-1);//左边序列。第一个索引位置到关键值索引-1
if(end<high) quickSort(arr,end+1,high); //右边序列。从关键值索引+1到最后一个
}
详细代码可以去我的Github:https://github.com/weiliangchun/JavaSort
Java初级开发技术交流群:619201650。欢迎加入进行技术交流,禁止闲聊、斗图。
Java排序算法之冒泡、选择、插入、快速的更多相关文章
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
- python 中的一些基础算法:递归/冒泡/选择/插入
递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...
- 44.python排序算法(冒泡+选择)
一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...
- 常用Java排序算法
常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...
- Java常见排序算法之直接选择排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java排序算法(二):直接选择排序
java排序算法(二) 直接选择排序 直接选择排序排序的基本操作就是每一趟从待排序的数据元素中选出最小的(或最大的)一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n- ...
随机推荐
- C# 单例3种写法
public class Singleton { private static Singleton _instance = null; private Singleton(){} public sta ...
- 【洛谷2624_BZOJ1005】[HNOI2008] 明明的烦恼(Prufer序列_高精度_组合数学)
题目: 洛谷2624 分析: 本文中所有的 "树" 都是带标号的. 介绍一种把树变成一个序列的工具:Prufer 序列. 对于一棵 \(n\) 个结点的树,每次选出一个叶子(度数为 ...
- 关于 android屏幕适配
一.关于布局适配 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如 ...
- 11 在C#中写文件
在这个练习中,我们来学习如何把我们想要的东西写到文件中.我们在这个练习中还是使用File类中的方法来完成写文件的操作. 在这个练习中我们要用C#创建一个纯文本文件ex11.txt 放到c盘的Exerc ...
- 批量建文件夹【win7企业版】
在记事本中notepad.exe按如下格式编辑好 md + 空格 + 文件夹名字(多个之间用空格隔开) 保存为.bat格式,运行即可批量创建文件夹.
- MySQL 多表批量更新
使用inner join 进行表更新sql 与mysql 的区别: SQL UPDATE W SET W.字段=新数据 FROM 表a W INNER JOIN 表B d ON W.wID=D.wid ...
- C#使用Win32函数的一些类型转换
C#在访问Win 32 Api时需要处理C 结构与C#结构的映射,这在MSDN以及许多Blog上都可以找到参考的资料.Win 32 中有一些定义复杂的Struct,这些结构体拥有长度固定的数组或者一些 ...
- java_servlet执行流程和生命周期
- 计组_IEEE754_练习题
IEEE754 阶码:移码:尾数:原码 一个规格化的32位浮点数x的真值可表示为: x=(-1)^s×(1. M) × 2^(E-127) e=E-127 其中尾数域 ...
- CentOS下使用yum安装配置和使用svn
安装说明 系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 检查已安装版本 ? 1 2 3 4 5 6 7 8 9 1 ...