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- ...
随机推荐
- PCB ODB++(Gerber)图形绘制实现方法
这里讲解一下用net解析PCB图形绘制实现方法 一.解析PCB图形绘制实现 解析PCB图形,说简单也非常简单,先说一下,PCB Gerber图形由:点,线,弧,铜皮,文字 5类元素组成,通常简写为:P ...
- PCB MongoDB 索引
在索引在数据库中非常重要,当然在MongoDB也是一样啦. 一.获取索引 db.ppeflow.getIndexes() 初始化,每个集都默认_id字段为主键objectid,索引名为_id_ 二.创 ...
- E20171006-hm
trace vt. 跟踪,追踪; 追溯,探索; 探索; 查找; vi. 沿着一小径或道路前进; 可以追溯的; n. 痕迹; 痕迹,踪迹; 微量,极少量; [植 ...
- vue中时间控件绑定多个输入框
首先去下载laydate时间控件,引入到相应的模板中 <input type="text" val-required="" value="&qu ...
- RabbitMQ死循环-延长ACK时间
一.应用背景 今天做一个需求,要将RabbitMQ中的任务取出并执行,为防止任务执行期间出错,设置NO_ACK=FALSE标志,这样.一旦任务没有应答的话,相应的任务就会被RabbitMQ自动Re-Q ...
- 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)
Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...
- scala的Map
package com.test.scala.test object MapTest { def main(args: Array[String]): Unit = { //定义一个不可变的map v ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理
SAS学习笔记之<SAS编程与数据挖掘商业案例>(3)变量操作.观测值操作.SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 ...
- Linux文件系统inode、block解释权限(三)
利用文件系统的inode和block来分析文件(目录)的权限问题. 为什么读取一个文件还要看该文件路径所有目录的权限? 为什么目录的w权限具有删除文件的能力,而文件w权限不行. inode:记录文件的 ...
- Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
一. 问题出现原因 我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...