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中几种排序算法的更多相关文章

  1. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  2. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  3. Java实现八种排序算法(代码详细解释)

    经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...

  4. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

  5. java实现八种排序算法并测试速度(详细)

    算法代码: /** * Created by CLY on 2017/3/17. */ package pers.cly.sorting; /** * 排序工具类,里面包含各种排序方法 */ publ ...

  6. java实现八种排序算法并测试速度

    速度测试: (1) 随机数范围:0-100希尔排序: => Time is 38600基数排序: => Time is 53300快速排序: => Time is 46500堆  排 ...

  7. Java中常见的排序算法

    这是我摘取的一段英文资料.我认为学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At ...

  8. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!

    今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...

  9. java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

随机推荐

  1. Codeforces 961E - Tufurama 树状数组

    转自:https://blog.csdn.net/my_sunshine26/article/details/79831362 题目大意: i从1开始 基本思路: 完全没思路,所以上来就二分,果不其然 ...

  2. python利用ConfigParser读写配置文件

    ConfigParser 是Python自带的模块, 用来读写配置文件, 用法非常简单. 配置文件的格式是: []包含的叫section,    section 下有option=value这样的键值 ...

  3. Mybatis配置——自动使用驼峰命名 属性映射字段(默认为false)

    开发一个新项目,用的springboot,相关配置不太熟悉,导致一些配置没配,到具体开发时问题就暴露出来了,记录第一个配置问题----Mybatis配置-自动使用驼峰命名 属性(userId)映射字段 ...

  4. docker 运行jenkins及vue项目与springboot项目(五.jenkins打包springboot服务且在docker中运行)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  5. Comet OJ 茶颜悦色 线段树+扫描线(矩形覆盖最多点+优化)

    题目:https://www.cometoj.com/contest/59/problem/D?problem_id=2713 题意:给你一个正方形,然后给你n个点,这个正方形能随意放哪,要求那个正方 ...

  6. js 常用功能实现(函数)

    1.10 个短小实用的代码片段 :https://www.jianshu.com/p/3ef822ec5a63 2.js常用函数  : https://www.cnblogs.com/wangyuyu ...

  7. SQL语句之-通配符

    四.用通配符过滤数据 1.LIKE模糊搜索 2.%0个1个多个字符 SELECT * FROM products WHERE prod_name LIKE 'Fish%' 区分大小写,任意位置,任意次 ...

  8. zabbix历史数据全部清楚

    #这种方法会出现 监控项不可用的情况 1.停掉zabbix_server 2.重重名表 RENAME TABLE history to history_20180117; RENAME TABLE h ...

  9. Windows-右键菜单添加选项

    新建 add.reg 输入选项名和选项对应程序路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\选项名] [HKEY ...

  10. C++构造函数异常(二)

    继续上一篇文章提到的构造异常话题,下面继续谈另外两个场景,即多继承构造异常,以及智能指针构造异常 第3:对多继承当中,某个基类构造异常,而其他基类已构造成功,则构造成功的基类不会析构,由编译器负责回收 ...