Java中几种排序算法
1、冒泡排序算法
通过多次比较(相邻两个数)和交换来实现排序
public class bubble {
public static void bubbleSort(int[] a) {
int temp;
for (int i = 1; i < a.length; i++) {
//将相邻两个数进行比较,较大的数往后冒泡
for (int j = 0; j < a.length - i; j++) {
if (a[j] > a[j + 1]) {
//交换相邻两个数
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
public static void main(String[] args) {
int[] mao= {213,123,342,543,12,67,98,320,421,4,15,54,27,34,17};
System.out.print("排序前的数组为:\n"); //输出排序前的数组
for(int i=0;i<mao.length;i++)
{
System.out.print(mao[i]+" ");
}
System.out.print("\n");
bubbleSort(mao); //排序操作
System.out.print("排序后的数组为:\n");
for(int i=0;i<mao.length;i++)
{
System.out.print(mao[i]+" "); //输出排序后的数组
}
System.out.print("\n");
}
}
2、直接插入排序
通过对未排序的数据执行逐个插入至合适的位置而完成排序
public class straight{
public static void straightInsertion(int[] arr) {
int current;//要插入的数
//从1开始第一次一个数不需要排序
for (int i = 1; i < arr.length; i++) {
current = arr[i];
int j = i - 1; //序列元素个数
//从后往前循环,将大于当前插入数的向后移动
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j]; //元素向后移动
j--;
}
arr[j + 1] = current; //找到位置,插入当前元素
}
}
}
3、快速选择排序
通过多次比较和交换来实现排序。首先设定一个分界值,将所有数值与分界值比较,左小右大,比较和交换数据值进而完成排序
public class quick{
static void quickSort(int[] arr,int left,int right) {
int f,t,rtemp,ltemp;
ltemp=left;
rtemp=right;
f=arr[(left+right)/2]; //分界值
while(ltemp<rtemp)
{
while(arr[ltemp]<f)
{
++ltemp;
}
while(arr[rtemp]>f)
{
--rtemp;
}
if(ltemp<=rtemp)
{
t=arr[ltemp];
arr[ltemp]=arr[rtemp];
arr[rtemp]=t;
rtemp--;
ltemp++;
}
}
if(left<rtemp)
{
quickSort(arr,left,ltemp-1); //递归调用
}
if(ltemp<right)
{
quickSort(arr,rtemp+1,right); //递归调用
}
}
}
4、希尔排序,又称Shell排序或缩小增量排序
(1)将有个数据和第n/2+1个数据为一对。
(2)一次循环使每一个序列对排好顺序。
(3)然后,再变为n/4个序列,再次排序。
(4)不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。
public class shell{
static void shellSort(int[] a){
int h,temp,x=0;
for(int r=a.length/2;r>=1;r/= 2) //划组排序
{
for(int i=r;i<a.length;i++)
{
temp=a[i];
int j=i-r;
while(j>=0 && temp<a[j])
{
a[j+r]=a[j];
j-=r;
}
a[j+r]=temp;
}
x++;
}
}
}
5、堆排序
构造堆结构、堆排序输出来实现排序
public class pratice {
public static void heapSort(int a[],int n)
{
int i,j,h,k;
int t;
for(i=n/2-1;i>=0;i--) //将a[0,n-1]建成大根堆
{
while(2*i+1<n) //第i个结点有右子树
{
j=2*i+1 ;
if((j+1)<n)
{
if(a[j]<a[j+1]) //右左子树小于右子树,则需要比较右子树
j++; //序号增加1,指向右子树
}
if(a[i]<a[j]) //比较i与j为序号的数据
{
t=a[i]; //交换数据
a[i]=a[j];
a[j]=t;
i=j ; //堆被破坏,需要重新调整
}
else //比较左右子结点均大则堆未破坏,不再需要调整
{
break;
}
}
}
//输出构成的堆
System.out.print("原数据构成的堆:");
for(h=0;h<n;h++)
{
System.out.print(" "+a[h]); //输出
}
System.out.print("\n");
for(i=n-1;i>0;i--)
{
t=a[0]; //与第i个记录交换
a[0] =a[i];
a[i] =t;
k=0;
while(2*k+1<i) //第i个结点有右子树
{
j=2*k+1 ;
if((j+1)<i)
{
if(a[j]<a[j+1]) //右左子树小于右子树,则需要比较右子树
{
j++; //序号增加1,指向右子树
}
}
if(a[k]<a[j]) //比较i与j为序号的数据
{
t=a[k]; //交换数据
a[k]=a[j];
a[j]=t;
k=j ; //堆被破坏,需要重新调整
}
else //比较左右子结点均大则堆未破坏,不再需要调整
{
break;
}
}
}
}
}
6、归并排序
两两合并,进行比较、交换来实现排序
public class marge {
public 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) //最后一段可能少于len个结点
{
e=n-1;
}
//相邻有序段合并
k=s;
i=s;
j=s+len;
while(i<s+len && j<=e) //如果两个有序表都未结束时,循环比较
{
if(a[i]<=a[j]) //如果较小的元素复制到数组b中
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++];
}
}
while(i<s+len) //未合并的部分复制到数组b中
{
b[k++]=a[i++];
}
while(j<=e)
{
b[k++]=a[j++]; //未合并的部分复制到数组b中
}
s=e+1; //下一对有序段中左段的开始下标
}
if(s<n) //将剩余的一个有序段从数组A中复制到数组b中
{
for(;s<n;s++)
{
b[s]=a[s];
}
}
}
static void mergeSort(int a[],int n) //合并排序
{
int h,count,len,f;
count=0; //排序步骤
len=1; //有序序列的长度
f=0; //变量f作标志
int[] p=new int[n];
while(len<n)
{
if(f==1) //交替在A和P之间合并
{
mergeOne(p,a,n,len); //p合并到a
}
else
{
mergeOne(a,p,n,len); //a合并到p
}
len=len*2; //增加有序序列长度
f=1-f; //使f值在0和1之间切换
count++;
System.out.printf("第"+count+"步排序结果:"); //输出每步排序的结果
for(h=0;h<SIZE;h++)
{
System.out.printf(" "+a[h]); //输出
}
System.out.print("\n");
}
if(f==1) //如果进行了排序
{
for(h=0;h<n;h++) //将内存p中的数据复制回数组a
{
a[h]=p[h];
}
}
}
}
Java中几种排序算法的更多相关文章
- Java 的八种排序算法
Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...
- 数据结构(三) 用java实现七种排序算法。
很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...
- Java实现八种排序算法(代码详细解释)
经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...
- java实现8种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
- java实现八种排序算法并测试速度(详细)
算法代码: /** * Created by CLY on 2017/3/17. */ package pers.cly.sorting; /** * 排序工具类,里面包含各种排序方法 */ publ ...
- java实现八种排序算法并测试速度
速度测试: (1) 随机数范围:0-100希尔排序: => Time is 38600基数排序: => Time is 53300快速排序: => Time is 46500堆 排 ...
- Java中常见的排序算法
这是我摘取的一段英文资料.我认为学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- java算法03 - 常用的8种排序算法
Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...
随机推荐
- 玩玩Mybatis的逆向工程
通过数据库 逆向生成代码 主要配置的文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- 怀旧浪潮来袭,小霸王游戏、windows95......曾经的经典哪些能戳中你的心怀?
随着前两天上架的 Rewound 在 iPhone 上复刻了 iPod Classic为大家掀起一场怀旧浪潮,那么除了 Rewound还有什么经典?今天我们就来怀旧一下那些曾经的经典.80经典小霸王游 ...
- MariaDB 建立连接
与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件. MySQL脚本 查看下面给出的示例. [root@host]# mysql -u root -p Enter passwo ...
- 记一次引入less自己坑自己的坑....
loader里该有的loader都有了,但是在npm run dev的时候,就是找不到less文件. 最后,才发现,用了postcss-loader,但是去package.json里查了一下,并没有安 ...
- Gson extend 思路
package org.rx.core.internal; import com.google.gson.*; import net.sf.cglib.proxy.Enhancer; import n ...
- ajax请求在参数中添加时间戳
ajax请求在参数中添加时间戳 参考网址
- selenium自动化测试时,chrome 出现“Chrome 正受到自动测试软件的控制”的解决办法
背景 使用selenium自动化测试的时候,启动浏览器出现'Chrome正在受到自动软件的控制'的问题,修改方法有两种. 一.在浏览器配置里加个参数,忽略掉这个警告提示语:disable_infoba ...
- 2019牛客多校第五场B-generator 1(矩阵快速幂)
generator 1 题目传送门 解题思路 矩阵快速幂.只是平时的矩阵快速幂是二进制的,这题要用十进制的快速幂. 代码如下 #include <bits/stdc++.h> #defin ...
- PAT甲级——A1140 LookAndSaySequence【20】
Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...
- Java对象toString()方法
对象的字符串表示以可读格式包含有关对象状态的信息.Object类的toString()方法表示字符串中类的对象.Object类提供了toString()方法的默认实现. 它返回一个以下格式的字符串: ...