排序算法的java实现
冒泡、选择就不写了。很常见
一:插入排序:
/**
* 插入排序
*/
public class P4_3 {
static void insertSort(int[] a){
int j,t;
/**
*
*/
for (int i = 0; i < a.length; i++) {
t=a[i];
j=i-1;
while (j>=0&&t<a[j]){
a[j+1]=a[j];
j--;
}
a[j+1]=t;
} }
public static void main(String[] args){
int[] a=new int[]{3,4,2,6,2,5,1,9,28};
insertSort(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
} }
}
二:shell排序
/**
* shell sort
*/
public class P4_4 {
static void shellsort(int[] a){
for (int r = a.length/2; r >=1 ; r/=2) {
for (int i = r; i < a.length; i++) {
int t=a[i];
int j=i-r;
while (j>=0&&t<a[j]){
a[j+r]=a[j];
j=j-r;
}
a[j+r]=t;
}
}
}
public static void main(String[] args){
int[] a=new int[]{3,4,2,6,25,1,9,28};
shellsort(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
三:快排
/**
* qicksort
*/
public class P4_5 {
static void qicksort(int[] a,int left,int right){
int f,t;
int rtemp,ltemp;
rtemp=right;
ltemp=left;
f=a[(right+left)/2];
while (ltemp<rtemp){
while (a[ltemp]<f){
ltemp++;
}
while (a[rtemp]>f){
rtemp--;
}
if (ltemp<rtemp){
//将左边大于分界值得数交换到邮编小于分界值得位置
t=a[rtemp];
a[rtemp]=a[ltemp];
a[ltemp]=t;
ltemp++;
rtemp--;
}
}
if (ltemp==rtemp){
ltemp++;
}
if (right>ltemp){
qicksort(a,rtemp+1,right);
}
if (rtemp>left){
qicksort(a,left,ltemp-1);
}
}
public static void main(String[] args){
int[] a=new int[]{3,4,2,6,25,1,9,73};
qicksort(a,0,a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
} }
}
四:堆排序
/**
* heapsort
*/
public class P4_6 {
static void heapsort(int[] a,int n){
int i,j,h,k;
int t;
//构建堆
for (i = n/2-1; i >=0 ; i--) {//找到当前最后一个节点的父节点
//存在右子树
while (2*i+1<n){
j=2*i+1;
if (j+1<n){
if (a[j]<a[j+1]){
j++;
}
}
//将最大的放在节点位置
if (a[i]<a[j]){
t=a[i];
a[i]=a[j];
a[j]=t;
i=j;
}else {
break;
}
}
}
//输出堆:
System.out.println("输出的堆:");
for (int l = 0; l < a.length; l++) {
System.out.print(a[l]);
System.out.print(" ");
System.out.println();
} //找出最大
for (i = n-1; i >=0 ; i--) {
//将找到的数据放在最右边
t=a[0];
a[0]=a[i];
a[i]=t;
k=0;
//k存在有子树
while ((2*k+1)<i){
j=2*k+1;
if((j+1)<i){
if (a[j]<a[j+1]){
j++;
}
}
if (a[k]<a[j]){
t=a[k];
a[k]=a[j];
a[j]=t;
k=j;
}else {
break;
}
} } }
public static void main(String[] args){
int[] a=new int[]{1,3,5,7,9,2,4,6,8,0};
heapsort(a,a.length);
for (int l = 0; l < a.length; l++) {
System.out.print(a[l]);
System.out.print(" ");
}
}
}
五:归并排序
/**
* mergesort
*/
public class P4_7 {
static void mergeone(int[] a,int[] b,int n,int len){
int i,j,k,s,e;
s=0;//开始位置
while ((s+len)<n){
//结束位置
e=s+2*len-1;
if (e>n){
e=n-1;
}
//合并
k=s;
i=s;
j=s+len;
while (i<(s+len)&&j<=e){
if (a[i]<a[j]){
b[k++]=a[i++];
}else {
b[k++]=a[j++];
}
}
//将未合并的数组复制
while (i<(s+len)){
b[k++]=a[i++];
}
while (j<=e){
b[k++]=a[j++];
}
s=e+1;//下一次开始的位置 }
//没有比较的合并过来
if (s<n){
for (;s<n;s++){
b[s]=a[s];
}
}
}
static void mergesort(int[] a,int n){
int[] p=new int[n];
int f,len;
len=1;
f=0;
while (len<n){
if (f==1){
mergeone(p,a,n,len);
}else {
mergeone(a,p,n,len);
}
len=2*len;
f=1-f;
}
if (f==1){
for (int h = 0; h < n; h++) {
a[h]=p[h];
}
}
}
public static void main(String[] args){
int[] a=new int[]{3,4,2,6,25,1,9,92,19};
mergesort(a,a.length);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
排序算法的java实现的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 7种基本排序算法的Java实现
7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...
- 几种简单的排序算法(JAVA)
几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 几大排序算法的Java实现(原创)
几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
- 基本排序算法——冒泡排序java实现
冒泡排序是原理最简单的一种排序算法,具体思想就不多说了,代码如下: eclipse4.3中编译通过 package sort.basic; import java.util.Arrays; publi ...
- 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)
排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...
- 排序算法(JAVA)
import java.util.Random; /** * 排序测试类 * * 排序算法的分类如下: * 1.插入排序(直接插入排序.折半插入排序.希尔排序): * 2.交换排 ...
随机推荐
- nowcoder 202F-平衡二叉树
题目链接 题目描述 平衡二叉树,顾名思义就是一棵“平衡”的二叉树.在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情 ...
- iOS 代码片段的添加!
说明.代码片段就是方便快捷输入的片段,类似do -while.switch等这些系统语句,这些系统的语句也是代码片段,快速输入一些常用的代码语句,就可以把这些语句写成代码片段! Example: 我们 ...
- Backdooring a OS VM
Backdooring a OS VM 来源 https://www.cnblogs.com/studyskill/p/6524672.html 提示: 1.经过实验,fortios 5.4 be ...
- 【比赛】NOIP2017 宝藏
这道题考试的时候就骗了部分分.其实一眼看过去,n范围12,就知道是状压,但是不知道怎么状压,想了5分钟想不出来就枪毙了状压,与AC再见了. 现在写的是状压搜索,其实算是哈希搜索,感觉状压DP理解不了啊 ...
- RocketMQ生产者消息篇
系列文章 RocketMQ入门篇 RocketMQ生产者流程篇 RocketMQ生产者消息篇 前言 上文RocketMQ生产者流程篇中详细介绍了生产者发送消息的流程,本文将重点介绍发送消息的通信模式以 ...
- 【BZOJ1853】幸运数字(搜索,容斥)
[BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- 【ARC068F】Solitaire
Description 你有一个双端队列和 \(N\) 个数字,先按 \(1\) 到 \(N\) 的顺序每次从任意一端插入当前数字,再进行 \(N\) 次操作每次可以从两端弹出,求有多少种弹出序列 ...
- BZOJ3829 [Poi2014]FarmCraft 【树形dp】
题目链接 BZOJ3829 题解 设\(f[i]\)为从\(i\)父亲进入\(i\)之前开始计时,\(i\)的子树中最晚装好的时间 同时记\(siz[i]\)为节点\(i\)子树大小的两倍,即为从父亲 ...
- Java考试题之九
QUESTION 177 Given: 1. class TestException extends Exception { } 2. class A { 3. public ...