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. Java集合类里面最基本的接口

    Collection:代表一组对象,每一个对象都是它的子元素. Set:不包含重复元素的Collection. List:有顺序的Collection,并且可以包含重复元素. Map:可以把键(key ...

  2. ReactNative 遇到的问题汇总

    1.react-native 启动项目出现如下报错 解决方法: nvm install v9.0.0 nvm alias default v9.0.0

  3. jsp 锚定位的方式

    //js定位方式1 document.getElementById('id').scrollIntoView(); //jquery定位方式 var t = $('#id').offset().top ...

  4. C# 在Word表格中插入新行(表格含合并行)

    public string CreateWordFile(string CheckedInfo)         {             string message = "" ...

  5. 【TCP】四次握手原因 / TIME_WAIT作用

    为什么建立TCP连接需要三次握手? 原因:为了应对网络中存在的延迟的重复数组的问题 例子: 假设client发起连接的连接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,导致延迟到达ser ...

  6. 基于CentOS 7.3 安装Ceph Jewel 10.2.9

    https://www.lijiawang.org/posts/intsall-ceph.html 配置说明: 采用了4台centos7.3系统的虚拟机,1台Ceph-Master作为安装节点,NTP ...

  7. hdu 6085 Rikka with Candies (set计数)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  8. 微信小程序常用API组件开发

    关于小程序 张小龙定义小程序: 1.不需要下载安装即可使用: 2.用完即走,不用关心是否安装太多应用: 3.应用无处不在,随时可用. 特点: 1.适合业务逻辑简单的应用: 2,.适合低频应用: 3.适 ...

  9. Springboot项目静态资源配置

    springboot项目的静态资源配置网上有好多,说的也很详细 我今天出错是自定义了一个filter,在shiro里配置的/**,自定义filter 所以一直报302

  10. ubuntu下安装apidoc

    1.到http://nodejs.cn/download/下载nodejs 可以复制链接 使用wget下载更加快速 选择对应的操作系统位数 下载到/usr/local/src 此处强烈不建议编译安装 ...