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- ...
随机推荐
- 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
最近在新项目中突然出现了 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...
- poj Code(组合数)
Code Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9918 Accepted: 4749 Description ...
- Tyvj1305最大子序和(单调队列优化dp)
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- C/C++常用头文件 以及简单应用介绍
C/C++头文件一览 C #include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> ...
- 高斯消元_HihoCoderOffer6_03
题目3 : 图像算子 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果. 假设原图 ...
- [ NOIP 1998 ] TG
\(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...
- [hihocoder][Offer收割]编程练习赛64
公平划分 若条件满足,则所有数异或和为零,这时候随便分都可以,答案为2^n-2,否则答案为0 #pragma comment(linker, "/STACK:102400000,102400 ...
- Java&Xml教程(五)使用SAX方式解析XML文件
Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载. javax.xml.parsers ...
- [Java]Java分层概念
service是业务层 action层即作为控制器 DAO (Data Access Object) 数据访问 1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能 ...
- java 向上,向下转型
在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...