java讲讲几种常见的排序算法(二)

目录

堆排序

思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点(大顶堆反之)。

构建完一个小顶堆后,开始排序。 将最后一个节点和第一个节点交换位置(根节点是最小的,最小的顶点放到了后面),交换后进行调整,保持小顶堆(次小的顶点到了根节点)。

依次执行下去,这样每一次交换将最小的顶点的放到了最后,所以最后数组会从大到小排列。

public static void heapSort(int array[])
{
int j=array.length;
//构建堆
for (int i = j/2-1; i >=0; i--) {
f(i,j,array);
}
//堆排序,从后面的节点开始更第一个节点交换位置,然后进行调整,这样数组将从大到小排列
for (int i = j-1; i>=0; i--) {
// System.out.println(array[0]);
swap(array,i,0);
f(0,i,array);
}
}
public static void f(int low,int high,int array[])
{
int i=low;
int j=2*i+1;
int temp=array[i];
while(j<high)
{
//左节点和有节点哪个大
if(j<high-1&&array[j]>array[j+1])
j++;
//如果大于根节点,进行上浮,将该节点上浮,对下面的子树再进行调整
if(array[j]<temp)
{
array[i]=array[j];
i=j;
j=2*i+1;
}
else
break;
}
array[i]=temp;
}

桶排序

思路:构建十个桶,0-9十个桶,每个桶存放一个链表。

比如 26 16 3,先从个位数开始,分别是 6 6 3,所以第6个桶的链表存放26 16,第3个桶的链表存放3,然后按顺序从0-9个桶读取,读取完数组顺序是3 26 16。

接着再从十位开始,分别是0 2 1,所以同样的操作放入桶里,这样的话第0个桶存放3,第二个桶存放26,第一个桶存放16,然后按顺序从0-9个桶读取,最后按顺序排列3 16 26。因为十位已经是最大位,所以停止排序。

//创建10个桶,每个桶存一个链表
public static List createBucket()
{
List <LinkedList<Integer>>bucketList=new ArrayList<LinkedList<Integer>>(10);
for (int i = 0; i < 10; i++) {
bucketList.add(new LinkedList<Integer>());
}
return bucketList;
}
public static void bucketSort(int array[],int base,List<LinkedList<Integer>> bucketList)
{ //100以内的数,超过100不用再就千分位的数
if(base==1000)
return;
for (int i = 0; i < array.length; i++) {
LinkedList<Integer> bucket=bucketList.get((array[i]/base)%10);
bucket.add(array[i]);
}
int index=0;
for (int i = 0; i < bucketList.size(); i++) {
LinkedList<Integer> bucket=bucketList.get(i);
if(bucket.isEmpty())
continue;
else
{
while(!bucket.isEmpty())
{
array[index]=bucket.poll();
index++;
}
}
}
bucketSort(array,base*10,bucketList); }

归并排序

思路:将一个数组分成两部分(A,B)。

A实现左边有序,再实现右边有序,然后进行合并,最后实现A这一个大部分实现有序。

然后B同样进行以上同样的操作,最后B这一大部分实现有序,最后,AB合并,实现整体有序。

同样,在实现A的有序也是自底向上进行合并的。

public static void mergeSort(int array[],int first,int end,int temp[])
{
int mid=(first+end)/2;
if(first<end)
{
//左边有序
mergeSort(array,first,mid,temp);
//右边有序
mergeSort(array,mid+1,end,temp);
//进行合并
merge(array,first,mid,end,temp);
}
}
public static void merge(int array[],int first,int mid,int end,int temp[])
{
int index1=first,index2=mid+1;
int k=first;
for (int i = first; i < end+1; i++) {
temp[i]=array[i];
}
while(true)
{ if(index1==mid+1&&index2==end+1)
{
break;
}
else
{
if(index1==mid+1)
{
for(int n=index2;n<=end;n++)
{
array[k++]=temp[n];
}
break;
}
else if(index2==end+1)
{
for(int n=index1;n<=mid;n++)
{
array[k++]=temp[n];
}
break;
}
else
{ if(temp[index1]<temp[index2])
{
array[k++]=temp[index1++];
}
else
{
array[k++]=temp[index2++];
} }
} }
}

后面会继续更新几种常见排序算法。

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

java讲讲几种常见的排序算法(二)的更多相关文章

  1. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

  2. Java实现7种常见的排序算法

    数据结构中的内部排序:不需要访问外存便能完成,是一个逐步扩大记录的有序序列长度的过程. 可以分为5类: 1.插入排序:直接插入排序,稳定排序,时间复杂度为O(n^2)非递减有序,设置r[0]为哨兵进行 ...

  3. 用Java实现几种常见的排序算法

    用Java语言实现的各种排序,包括插入排序.冒泡排序.选择排序.Shell排序.快速排序.归并排序.堆排序.SortUtil等. 插入排序: package org.rut.util.algorith ...

  4. java几种常见的排序算法总结

    /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int  ...

  5. 七种常见经典排序算法总结(C++实现)

    排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...

  6. python3实现几种常见的排序算法

    python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  7. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  8. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  9. 用php实现四种常见的排序算法

    几种常见的排序 排序是一个程序员的基本功,对于初级phper,更是可以通过排序算法来锻炼自己的思维能力. 所谓排序,就是对一组数据,按照某个顺序排列的过程.下面就总结四种常用的php排序算法,分别是冒 ...

随机推荐

  1. 改动app的默认设置(包含改动默认launcher)

    1.改为自己的launcher ComponentName component = new ComponentName( context.getPackageName(), MainActivity. ...

  2. Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit (建议全文复制到Word文档中通过导航窗格查看)

    Git使用手册 目录 1     引言 2     Git.GitLab简介 2.1      Git 2.2      GitLab 2.3      Git基本概念 3     运行环境 4    ...

  3. hdoj 1026 Ignatius and the Princess I 最小步数,并且保存路径

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. Hystrix的原理与使用

    转载自:https://segmentfault.com/a/1190000005988895              http://blog.csdn.net/xiaoyu411502/artic ...

  5. ssm开发系的统架构图

  6. VisualStudio“在查找预编译头使用时跳过"解决方案

    解决方案1:确保所有的cpp文件都包含了stdafx.h,且确保stdafx.h是第一个#include指令(经尝试,可行) 解决方案2:去掉预编译头 项目->属性->配置属性->c ...

  7. phan—php语法静态检查在windows下的配置

    php7推出了语法树,于是静态语法分析更方便了.(可以直接下载我配置好的,传送门百度网盘) 1.先安装php7,到http://windows.php.net/下载php7带openssl的. 2.修 ...

  8. scala中计算的的一个小问题,超出Int.maxValue时不会报错

    如果小于Int.max时他不会报错 def sumcount(str:String): Int ={ val ints = for(c <- str)yield { println(c.asIn ...

  9. SSL/TLS协议运行机制的概述_转

    转自:SSL/TLS协议运行机制的概述 作者: 阮一峰 日期: 2014年2月 5日 互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和 ...

  10. 2015 Multi-University Training Contest 3 1001 Magician

    Magician Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5316 Mean: n个数,2种操作,1是单点更新,2是询问区间 ...