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- ...
随机推荐
- ArgumentError: You need to supply at least one validatio
创建: 2017/10/02 意思: validate没有内容 例: validates :title
- 题目收藏夹(啥时候一遍A啥时候删)
以下题目为没有思路或代码离谱错误或看了题解才会的,间隔一周以上再做一遍A掉就删. bzoj1500 bzoj2287 codevs1358 bzoj1725
- [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Akka源码分析-Remote-Creating Actors Remotely
在akka官网中关于远程actor交互,介绍了两种方法,一种是通过actorSelection查询,另一种是通过actorOf在远程节点创建一个actor.actorSelection我们之前的博客中 ...
- Oracle 10g RAC的负载均衡配置[转载]
Oracle 10g RAC的负载均衡配置 负载均衡是指连接的负载均衡.RAC的负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作.在RAC中,负载均衡分为两种,一 ...
- SVN系列学习(一)-SVN的安装与配置
1.SVN的介绍 SVN是Subversion的简称,是一个开发源代码的版本控制系统,采用了分支管理系统. 文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器.你可 ...
- 二次封装OKHttp网络框架(1)
1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...
- Caffe2:ubuntu修改链接方式ln
参考:文件和目录命令-文件重定向 ln 使用caffe2,产生了此种情况: from caffe2.python import workspace >>WARNING:root:This ...
- Git与SVN版本控制系统
关于版本控制 什么是版本控制?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任 ...
- 哈夫曼树(Huffman Tree)
Date:2019-06-21 14:42:04 做题时更多的是用到哈夫曼树的构造思想,即按照问题规模从小到大,依次解决问题,可以得到最优解 Description: 在一个果园里,多多已经将所有的果 ...