8大排序算法的java实现--做个人收藏
排序算法分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因为数据量太大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。这里只讨论内部排序,常见的内部排序算法有:插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、及基数排序。
1、插入排序
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序的数据,在已排序序列中从后往前扫描,找到相应位置并插入。算法步骤如下:
- 将第一个待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成未排序序列;
- 从头到尾一次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置,即满足有序的顺序,若相等,则插入到这个相等元素的后面。
插入排序java代码:
public class InsertSort {
public static void insertSort(int []data){
for(int i=0;i<data.length-1;i++){
int temp=data[i+1];
int j=i;
while(j>-1&&data[j]>temp){
data[j+1]=data[j];
j--;
}
data[j+1]=temp;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int data[]=new int[]{12,5,44,11,50,9};
insertSort(data);
for(int i:data){
System.out.println(i);
}
} }
2、希尔排序
希尔排序也称为递减增量排序算法,是插入排序的一种改进,其思想是:先将整个待排序的序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。算法步骤如下:
- 选择一个增量序列t1,t2,...,tk,其中ti>tj,tk=1;
- 增量序列个数为k,对序列进行k趟插入排序;
- 每趟排序,根据对应的增量ti,将待排序序列分割成若干长度为m得子序列,然后对各子序列进行直接插入排序,当ti为1时,是对“基本有序”的整个序列排序。
希尔排序实现:
public class SellSort {
public static void sellSort(int []data){
int []step=new int[]{6,3,1};
int i,j,k;
for(int s:step){
for(i=0;i<s;i++){
for(j=i;j<data.length-s;j+=s){
k=j;
int temp=data[j+s];
while(k>-1&&data[k]>temp){
data[k+s]=data[k];
k-=s;
}
data[k+s]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9,23,32};
sellSort(data);
for(int i:data){
System.out.println(i);
}
} }
3、选择排序
选择排序是一种简单直观的排序算法,基本思想是:对待排序序列进行扫描,每次找到最小(大)的元素,然后和未排序序列的首元素进行交换,直到所有的待排序序列都是有序的为止。算法步骤如下:
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
- 再从剩余未排序序列中继续寻找最小(大)元素,然后放到已排序序列的末尾;
- 重复第二步,直到所有元素排序完毕。
选择排序实现代码:
public class SelectSort { public static void selectSort(int []data){
for(int i=0;i<data.length;i++){
int minIndex=i;//每次记录值最小的下标
int temp;
for(int j=i+1;j<data.length;j++){
if(data[j]<data[minIndex]) minIndex=j;
}
temp=data[i];
data[i]=data[minIndex];
data[minIndex]=temp;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9};
selectSort(data);
for(int i:data){
System.out.println(i);
}
} }
4、堆排序
堆排序是利用堆这种数据结构所设计的一种排序算法。这个堆所满足的性质是:子结点的键值总是不小于(不大于)它的父结点。算法基本步骤如下:
- 把未排序序列创建成为一个堆;
- 把堆首(为最大(小)值)和堆尾互换;
- 堆的规模减1,调整堆;
- 重复,直到所有元素排序完成。
堆排序实现:
public class HeapSort {
//初始化数组为最大堆
private static void initCreateHeap(int []data){
for(int i=data.length/2-1;i>=0;i--){
adjHeap(data,data.length,i);
}
}
//调整结点data[h],使之满足最大堆,n为data中剩余未排序的元素的个数
private static void adjHeap(int []data,int n,int h){
int i=h;
int l=2*i+1;
int temp=data[i];
boolean flag=true;
while(l<n&&flag){
if(l+1<n&&data[l]<data[l+1]) l++;
if(temp>data[l]){
flag=false;
}else{
data[i]=data[l];
data[l]=temp;
i=l;
l=2*i+1;
}
}
}
public static void heapSort(int []data){
initCreateHeap(data);
for(int i=data.length-1;i>0;i--){
int temp=data[i];
data[i]=data[0];
data[0]=temp;
adjHeap(data,i,0);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9,23,32};
heapSort(data);
for(int i:data){
System.out.println(i);
}
} }
5、冒泡排序
冒泡排序的基本思想是遍历未排序序列,把相邻的元素调整为有序,这样每次都会有最大(小)的元素出现在未排序序列的末尾,就跟冒泡泡一样,把这些元素有序地排出来了。算法步骤:
- 比较相邻的元素。如果不满足有序序列,就交换它们;
- 对每一对相邻元素都做同样的工作,从头到尾,最后末尾元素会是最大的数;
- 未排序的元素个数减1,重复以上工作。
算法实现代码:
public class BubbleSort {
public static void bubbleSort(int []data){
boolean flag=false;//标志位,如果有序可以提前结束循环
for(int i=0;i<data.length;i++){
if(flag) break;
flag=true;
for(int j=0;j<data.length-1-i;j++){
if(data[j]>data[j+1]){
int temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
flag=false;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9};
bubbleSort(data);
for(int i:data){
System.out.println(i);
}
} }
6、快速排序
快速排序的算法使用分治的策略来进行排序的,对于按从小到大的排序具体的实现步骤如下:
- 从数据序列中选出一个元素当基准
- 把比基准小的所有元素放到基准之前,把所有比基准大的元素放到基准之后,这样就把序列划分为以基准为分界的两个分区,基准之前分区的所有元素都比基准小,基准之后的分区的所有元素都比基准大;
- 两个分区递归的重复以上步骤,直到分区的元素个数小于1。
快速排序实现;
public class QuickSort {
public static void quickSort(int []data,int s,int e){
int i=s,j=e;
int temp=data[s];
while(i<j){
while(i<j){
if(data[j]<temp) {
data[i]=data[j];
i++;
break;
}
j--;
}
while(i<j){
if(data[i]>temp) {
data[j]=data[i];
j--;
break;
}
i++;
}
}
data[i]=temp;
if(s<i)quickSort(data,s,i-1);
if(j<e)quickSort(data,j+1,e);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9};
quickSort(data,0,data.length-1);
for(int i:data){
System.out.println(i);
}
} }
7、归并排序
归并排序是建立在归并操作上的一种有效的排序算法,也在采用分治的策略,算法步骤如下;
- 申请空间,使其大小为两个有序序列的和,该空间用来存放合并后的序列;
- 设定指针分别指向有序序列的起始位置;
- 比较两个指针所指向的元素,选择适当的加入合并空间,并移动指针;
- 重复第3步,直到某一指针到达序列尾;
- 将另一序列剩下的元素直接复制到合并序列末尾。
归并算法实现代码:
public class MergeSort {
//一次归并,k为归并子数组的长度,temp保存归并的中间结果
private static void merge(int []data,int []temp,int k){
int l1=0,l2,u1,u2;
int n=data.length;
int i,j,m=0; while(l1+k<=n-1){
u1=l1+k-1;
l2=u1+1;
u2=(l2+k>n)?n-1:l2+k-1; for(i=l1,j=l2;i<=u1&&j<=u2;){
if(data[i]<data[j]){
temp[m++]=data[i++];
}else{
temp[m++]=data[j++];
}
}
//若子数组1还有剩余的数据,则直接加入temp数组
while(i<=u1){
temp[m++]=data[i++];
}
//若子数组2还有剩余的数据,则直接加入temp数组
while(j<=u2){
temp[m++]=data[j++];
}
l1=u2+1;
}
//将剩余的只够一组的数据加进来
for(i=l1;i<n;){
temp[m++]=data[i++];
} }
public static void mergeSort(int []data){
int []temp=new int[data.length];
int k=1;
while(k<data.length){
merge(data,temp,k);
for(int j=0;j<data.length;j++) data[j]=temp[j];
k*=2;
} }
public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{12,5,44,11,50,9,23,32,27};
mergeSort(data);
for(int i:data){
System.out.println(i);
}
} }
8、基数排序
基数排序也叫做桶排序,是一种非比较型的整数排序算法,基本思想是将整数按位切割成不同的数字,然后放到不同的桶里面,然后根据桶的规则有序输出。实现步骤如下:
- 初始化d个桶,d为序列中数字的进制;
- 按照关键字最低位数值依次放入桶中,然后分别按照桶号顺序元素进桶先后次序收集数据元素,这样就得到一个新的排列,这个过程称为一次基数排序;
- 然后分别按照次地位直到最高位的顺序进行一次基数排序,进行m次基数排序后就会得到有序序列,这里的m是整数序列的最高位数。
基数排序代码:
public class RadixSort {
private static void radixSort(int []data,int m,int d){
int i,j,k,power=1;
int n=data.length;
Queue []q=new LinkedList[d]; //初始化队列数组
for(i=0;i<d;i++){
q[i]=new LinkedList();
}
//进行m次桶排序
for(i=0;i<m;i++){
for(j=0;j<n;j++){
k=data[j]/power-(data[j]/(power*d))*d;//取得每个数第i位的值
q[k].add(data[j]);
}
for(k=0,j=0;j<d;j++){
while(!q[j].isEmpty()){
data[k++]=(Integer)q[j].remove();
}
}
power*=d;
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
int []data=new int[]{710,841,342,45,686,6,429,134,68,264};
int m=3,d=10;//关键字是m位d进制的
radixSort(data,m,d);
for(int i:data){
System.out.println(i);
}
} }
================================================================================================================================================
以上排序算法归纳:
8大排序算法的java实现--做个人收藏的更多相关文章
- 九大排序算法的Java实现
1.冒泡排序 package Sort; import java.util.Arrays; public class BubbleSort { public static void main(Stri ...
- 十大排序算法(Java实现)
一.冒泡排序(Bubble Sort) public class BubbleSort { public static void main(String[] args) { int[] arr = { ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- 九大排序算法Java实现
之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 几大排序算法的Java实现(原创)
几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
- 十大排序算法总结(Python3实现)
十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...
随机推荐
- 2017 ACM-ICPC网络赛 H.Skiing 有向图最长路
H.Skiing In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort h ...
- DOS中断及程序调用
http://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html
- Hive 分析函数lead、lag实例应用
Hive的分析函数又叫窗口函数,在oracle中就有这样的分析函数,主要用来做数据统计分析的. Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead) ...
- Fiddler用AutoResponder实现app升级异步更新
先说一下我自己理解的异步更新:用app异步升级举例,app是否升级的检查是在启动app时访问服务器的,把app本地的最新版本号与服务器端的最新版本号做对比,假如不一致,则提示升级.但本次已经打开使用a ...
- 42、通过ontouch检测expandableListview的单击、长按、列表滚动
一.在model定义变量: public boolean isExpandableListviewScroll = false;//这个是 首先监听expandableListview的滚动: Exp ...
- 5个最佳的Android测试框架(带示例)
谷歌的Android生态系统正在不断地迅速扩张.有证据表明,新的移动OEM正在攻陷世界的每一个角落,不同的屏幕尺寸.ROM /固件.芯片组以及等等等等,层出不穷.于是乎,对于Android开发人员而言 ...
- ubuntu16.04中docker安装curl拒绝连接问题
在Ubuntu16.04中安装docker ce,安装步骤按照官网说明https://docs.docker.com/engine/installation/linux/docker-ce/ubunt ...
- NodeJs爬虫抓取古代典籍,共计16000个页面心得体会总结及项目分享
项目技术细节 项目大量用到了 ES7 的async 函数, 更直观的反应程序了的流程.为了方便,在对数据遍历的过程中直接使用了著名的async这个库,所以不可避免的还是用到了回调promise ,因为 ...
- Spring框架配置beans.xml
Spring学习笔记(一) 一.Spring 框架 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 ...
- 【bzoj4668】冷战 并查集按秩合并+朴素LCA
题目描述 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争 ...