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. Atititjs javascript异常处理机制与java异常的转换.js exception process

    Atititjs javascript异常处理机制与java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw err ...

  2. atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

    atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...

  3. xa

    题目描述把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入每个用例包含二个整数M和N.0<=m<=1 ...

  4. Java线程中断理解(interrupte)

    Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...

  5. Overflow sort stage buffered data usage of 33554495 bytes exceeds internal limit of 33554432 bytes

    MongoDB执行错误: Overflow sort stage buffered data usage of 33554495 bytes exceeds internal limit of 335 ...

  6. SNP密度分布模式

    1. window=100k,step=2k 统计每个window的snp密度,然后用mixtools的normalmixEM(两个组分的混合模型)统计snp的分布模式. R command: lib ...

  7. UNION types numeric and text cannot be matched

    NULL ::NUMERIC 有时候会遇到这个问题,那是因为几个SQL组合在一起的时候,同一个字段的值,出来了不同类型的时候,这种时候就需要进行转型的处理了.

  8. Unix系统编程()虚拟内存管理

    在之前学到过进程的内存布局中忽略了一个事实:这一布局存在于虚拟文件中. 因为对虚拟内存的理解将有助于后续对fork系统调用.共享内存和映射文件之类的主题阐述,这里还要学习一下有关虚拟内存的详细内容. ...

  9. Linux下清空缓冲区的方法

    Linux下清空缓冲区的方法 C标准规定fflush()函数是用来刷新输出(stdout)缓存的.对于输入(stdin),它是没有定义的.但是有些编译器也定义了fflush( stdin )的实现,比 ...

  10. Spider Studio 新版本 (码年吉祥版) - 浏览器视图 / 脚本库上线!

    各位哥哥姐姐弟弟妹妹小伙伴们春节好! 2014年对于我们程序员很重要, 因为今年是 "码" 年! SS在此重要之年到来之际热力推出两大重要功能恭贺新春: 1. 浏览器视图 以前SS ...