- 浏览: 31326 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
zpd00001:
大道理,刚毕业的菜鸟们是不懂的- -!!
毕业后五年之内将决定你的一生 人生与励志 -
li_47195:
看完后我沉默很久..所谓“优秀生”?..一篇转载,献给所有和我一样迷茫没有目标的人
为了便于管理,先引入个基础类:
一 插入排序
该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:
二 冒泡排序
这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)
三,选择排序
选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。
相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。
四 Shell排序
Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:
1)当数据规模小的时候非常高效
2)当给定数据已经有序时的时间代价为O(N)
所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。
这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。
一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)
所以我在实现Shell排序的时候采用该增量序列
五 快速排序
快速排序是目前使用可能最广泛的排序算法了。
一般分如下步骤:
1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)
2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。
3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
快速排序的核心在于分割算法,也可以说是最有技巧的部分。
还有归并排序,堆排序,桶式排序,基数排序,下次在归纳。
http://www.blogjava.net/javacap/archive/2007/12/13/167364.html
package algorithms; /** * @author yovn * */ public abstract class Sorter<E extends Comparable<E>> { public abstract void sort(E[] array,int from ,int len); public final void sort(E[] array) { sort(array,0,array.length); } protected final void swap(E[] array,int from ,int to) { E tmp=array[from]; array[from]=array[to]; array[to]=tmp; } }
一 插入排序
该算法在数据规模小的时候十分高效,该算法每次插入第K+1到前K个有序数组中一个合适位置,K从0开始到N-1,从而完成排序:
package algorithms; /** * @author yovn */ public class InsertSorter<E extends Comparable<E>> extends Sorter<E> { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;i<from+len;i++) { tmp=array[i]; int j=i; for(;j>from;j--) { if(tmp.compareTo(array[j-1])<0) { array[j]=array[j-1]; } else break; } array[j]=tmp; } } }
二 冒泡排序
这可能是最简单的排序算法了,算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。i从0一直到N-1从而完成排序。(当然也可以从数组开始端开始比较相邻两元素,把第i大的冒泡到数组的第N-i个位置。i从0一直到N-1从而完成排序。)
package algorithms; /** * @author yovn * */ public class BubbleSorter<E extends Comparable<E>> extends Sorter<E> { private static boolean DWON=true; public final void bubble_down(E[] array, int from, int len) { for(int i=from;i<from+len;i++) { for(int j=from+len-1;j>i;j--) { if(array[j].compareTo(array[j-1])<0) { swap(array,j-1,j); } } } } public final void bubble_up(E[] array, int from, int len) { for(int i=from+len-1;i>=from;i--) { for(int j=from;j<i;j++) { if(array[j].compareTo(array[j+1])>0) { swap(array,j,j+1); } } } } @Override public void sort(E[] array, int from, int len) { if(DWON) { bubble_down(array,from,len); } else { bubble_up(array,from,len); } } }
三,选择排序
选择排序相对于冒泡来说,它不是每次发现逆序都交换,而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。
相对与插入排序来说,选择排序每次选出的都是全局第i小的,不会调整前i个元素了。
package algorithms; /** * @author yovn * */ public class SelectSorter<E extends Comparable<E>> extends Sorter<E> { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ @Override public void sort(E[] array, int from, int len) { for(int i=0;i<len;i++) { int smallest=i; int j=i+from; for(;j<from+len;j++) { if(array[j].compareTo(array[smallest])<0) { smallest=j; } } swap(array,i,smallest); } } }
四 Shell排序
Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:
1)当数据规模小的时候非常高效
2)当给定数据已经有序时的时间代价为O(N)
所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。
这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。
一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)
所以我在实现Shell排序的时候采用该增量序列
package algorithms; /** * @author yovn */ public class ShellSorter<E extends Comparable<E>> extends Sorter<E> { /* (non-Javadoc) * Our delta value choose 2^k-1,2^(k-1)-1,.7,3,1. * complexity is O(n^1.5) * @see algorithms.Sorter#sort(E[], int, int) */ @Override public void sort(E[] array, int from, int len) { //1.calculate the first delta value; int value=1; while((value+1)*2<len) { value=(value+1)*2-1; } for(int delta=value;delta>=1;delta=(delta+1)/2-1) { for(int i=0;i<delta;i++) { modify_insert_sort(array,from+i,len-i,delta); } } } private final void modify_insert_sort(E[] array, int from, int len,int delta) { if(len<=1)return; E tmp=null; for(int i=from+delta;i<from+len;i+=delta) { tmp=array[i]; int j=i; for(;j>from;j-=delta) { if(tmp.compareTo(array[j-delta])<0) { array[j]=array[j-delta]; } else break; } array[j]=tmp; } } }
五 快速排序
快速排序是目前使用可能最广泛的排序算法了。
一般分如下步骤:
1)选择一个枢纽元素(有很对选法,我的实现里采用去中间元素的简单方法)
2)使用该枢纽元素分割数组,使得比该元素小的元素在它的左边,比它大的在右边。并把枢纽元素放在合适的位置。
3)根据枢纽元素最后确定的位置,把数组分成三部分,左边的,右边的,枢纽元素自己,对左边的,右边的分别递归调用快速排序算法即可。
快速排序的核心在于分割算法,也可以说是最有技巧的部分。
package algorithms; /** * @author yovn * */ public class QuickSorter<E extends Comparable<E>> extends Sorter<E> { /* (non-Javadoc) * @see algorithms.Sorter#sort(E[], int, int) */ @Override public void sort(E[] array, int from, int len) { q_sort(array,from,from+len-1); } private final void q_sort(E[] array, int from, int to) { if(to-from<1)return; int pivot=selectPivot(array,from,to); pivot=partion(array,from,to,pivot); q_sort(array,from,pivot-1); q_sort(array,pivot+1,to); } private int partion(E[] array, int from, int to, int pivot) { E tmp=array[pivot]; array[pivot]=array[to];//now to's position is available while(from!=to) { while(from<to&&array[from].compareTo(tmp)<=0)from++; if(from<to) { array[to]=array[from];//now from's position is available to--; } while(from<to&&array[to].compareTo(tmp)>=0)to--; if(from<to) { array[from]=array[to];//now to's position is available now from++; } } array[from]=tmp; return from; } private int selectPivot(E[] array, int from, int to) { return (from+to)/2; } }
还有归并排序,堆排序,桶式排序,基数排序,下次在归纳。
http://www.blogjava.net/javacap/archive/2007/12/13/167364.html
发表评论
-
【转】PC安卓模拟器PANIC: Could not open:C:\Documents and Settings\Administrator\.android
2013-03-13 23:43 816在初次运行Android程序的 ... -
再谈重入锁--ReentrantLock
2012-12-26 20:50 402重入锁(ReentrantLock)是一种递归无阻塞的同步机制 ... -
Spring 设置支态定时任务
2012-11-27 12:27 649什么是动态定时任务:是由客户制定生成的,服务端只知道 ... -
Java TCP/IP Socket 编程 笔记(四)—发送和接收数据
2012-10-29 20:17 19211.TCP/IP协议要求信息必须在块(chunk)中发送和接收 ... -
Java TCP/IP Socket 编程 笔记(三)—UDP的例子
2012-10-29 19:53 9101.UDP套接字与TCP套接字 ... -
Java TCP/IP Socket 编程 笔记(二)—TCP的例子
2012-10-29 19:49 7561.InetAddress类和SocketAddress用于 ... -
Java TCP/IP Socket 编程 笔记(一)—基本概念
2012-10-29 19:42 857一些概念: 通信信道(communication c ... -
java并发编程不得不知道的几件事(转载)
2012-10-29 19:31 646多线程编 ... -
Web.XML 配置详解
2012-09-07 11:56 578每一个站的WEB-INF下都有一个web.xml的设定文件, ... -
java 多线程编程需要注意的23条
2012-08-13 15:56 5751.多线程中有主内存和 ... -
感受Java中的多线程设计
2012-08-13 15:49 655我就不说最初那个单核CPU时代了,我们从多进程编程开始讲。 ... -
排序算法(JAVA)(二)归并排序,堆排序,桶式排序,基数排序
2012-07-11 09:05 545六 归并排序 算法思想是每次把待排序列分成两部分,分别对这两部 ... -
理解ThreadLocal
2012-04-28 16:05 0ThreadLocal是什么 早在JDK ... -
Java反射机制
2011-12-31 13:16 669http://www.cnblogs.com/Quincy/ ... -
Java5.0多线程编程
2011-11-22 16:00 708[size=large] Lock接口 ReentrantL ... -
Java Map遍历的方法
2011-11-09 19:41 833第一种:利用entryset遍历 Map map = ne ... -
Java常见异常汇总
2011-11-09 19:27 663转自于: http://www.javaask.com/jav ... -
java io/流
2011-11-09 19:20 482[转]JAVA IO流 http://www.blogjava ... -
Java:使用synchronized和Lock对象获取对象锁
2011-11-07 12:43 547原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ... -
Java线程:创建与启动
2011-10-31 13:50 599一、定义线程 1、扩展 ...
相关推荐
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...
八种排序算法原理及Java实现是排序算法中的一种,包括冒泡排序、快速排序、直接插入排序、希尔排序、选择排序、归并排序和基数排序等。 冒泡排序是八种排序算法中的一种,属于交换排序。冒泡排序的基本思想是重复...
这里我们主要探讨的是五种不同的排序算法:插入排序、选择排序、快速排序、希尔排序以及冒泡排序,它们都有对应的链表实现。让我们逐一深入理解这些算法。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观...
冒泡排序是一种简单的排序算法,通过不断交换相邻两个元素的位置来逐步将较大的元素推向数组的后部。它的主要思想是重复遍历数组,每次比较相邻的元素,如果顺序错误就交换。Java实现时,通常会设置一个标志位来...
本篇将详细介绍标题和描述中提到的几种排序算法,包括冒泡排序、选择排序、插入排序、基数排序、归并排序、计数排序、堆排序、快速排序以及Shell排序。 1. **冒泡排序**:这是一种简单的排序算法,通过重复遍历待...
除了插入排序和希尔排序,压缩包中还可能包含了其他几种常见的排序算法的Java实现,如冒泡排序、快速排序、选择排序、归并排序和堆排序等。每种排序算法都有其特定的适用场景和性能特点。例如,冒泡排序虽然简单,但...
冒泡排序是一种简单的交换式排序算法。它通过重复遍历待排序的元素列表,比较相邻元素并根据需要交换它们,使得每次遍历都将最大(或最小)的元素"冒泡"到数组的一端。Java实现中,一般会用两个嵌套循环来完成这一...
冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较相邻元素并交换顺序,使得最大的元素逐渐“冒”到数组的一端。虽然效率较低,但对于小规模数据排序,仍然有其应用价值。 2. **选择排序(Selection Sort)**...
这里我们将深入探讨快速排序、归并排序、希尔排序、冒泡排序、选择排序以及插入排序这六种经典的排序算法,并通过Java语言来实现它们。 1. **快速排序**:由C.A.R. Hoare在1960年提出,是基于分治策略的一种高效...
在实际应用中,根据数据特点选择合适的排序算法至关重要,例如,希尔排序对于大规模数据的初步排序非常有效,而冒泡排序则适合小规模或部分有序的数据。熟练运用这些排序算法,能帮助我们编写出更加高效和优化的代码...
本文将详述Java语言实现的六种经典排序算法:冒泡排序、选择排序、插入排序、归并排序、希尔排序以及快速排序。这些排序算法各有特点,适用于不同的场景。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序...
在Java中,这些排序算法都可以用代码实现,可以通过`java.util.Arrays.sort()`方法使用内置的快速排序或归并排序,也可以自定义排序逻辑。在`AllSort`这个压缩包中,可能包含了这八种排序算法的Java实现代码,通过...
冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 2. **选择...
2. **快速排序**:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个...
本文将深入探讨在Java中实现的一些常见排序算法,包括冒泡排序、选择排序、Shell排序、快速排序以及归并排序。 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换位置...
在编程领域,排序算法是计算机科学的基础之一,尤其是在Java这样的高级编程语言中。排序算法用于组织数据,使得数据按照特定顺序排列,这对于数据分析、数据库管理等应用至关重要。本篇文章将详细探讨Java中常见的八...