- 浏览: 303339 次
- 性别:
- 来自: 郴州
文章分类
- 全部博客 (70)
- hadoop (0)
- lucene (1)
- heritrix (1)
- webservice (0)
- css+div (0)
- java (29)
- javaweb (3)
- spring (2)
- hibernate (3)
- struts (5)
- struts2 (3)
- tomcat (1)
- map/reduce (0)
- ajax (0)
- android (3)
- oracle (3)
- 面试题 (1)
- 生活 (0)
- 开发工具 (1)
- 面试实习 (0)
- 设计模式 (3)
- 数据结构 (5)
- 论坛 (2)
- flex (3)
- PureMVC (1)
- java,jdk (1)
- sql server (1)
- 报表 (1)
- 算法 (4)
- 工作 (0)
最新评论
-
lp895876294:
第三种方式类似于工厂方法模式了
设计模式之单例模式(三种实现方式) -
xchsh12345:
如果用的是linux服务器呢
解决利用iText导出PDF报表中文乱码两种方式 -
memoryisking:
写的不错,关于Timer和TimeTask的内容网上资料挺多的 ...
Java定时调度 Timer类和TimerTask类 -
linfeng0169:
写的不错~!不过就是解释的不算好!
Calendar类add()与roll()方法的区别 -
u013606853:
好流弊的样子,LZ V5~
hibernate注解详解
交换排序的主体操作是对数组中的数据不断进行交换操作。交换排序主要有冒泡排序和快速排序。
一、冒泡排序
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
定义数据包装类:
二、快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
一、冒泡排序
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数。
定义数据包装类:
//定义一个数据包装类 public class DataWrap implements Comparable<DataWrap> { int data; String flag; public DataWrap(int data, String flag) { this.data = data; this.flag = flag; } public String toString() { return data + flag; } //根据data实例变量来决定两个DataWrap的大小 public int compareTo(DataWrap dw) { return this.data > dw.data ? 1 : (this.data == dw.data ? 0 : -1); } }
public class BubbleSort { public static void bubbleSort(DataWrap[] data) { System.out.println("开始排序"); int arrayLength = data.length; for (int i = 0; i < arrayLength - 1 ; i++ ) { boolean flag = false; for (int j = 0; j < arrayLength - 1 - i ; j++ ) { //如果j索引处的元素大于j+1索引处的元素 if (data[j].compareTo(data[j + 1]) > 0) { //交换它们 DataWrap tmp = data[j + 1]; data[j + 1] = data[j]; data[j] = tmp; flag = true; } } System.out.println(java.util.Arrays.toString(data)); //如果某趟没有发生交换,则表明已处于有序状态 if (!flag) { break; } } } public static void main(String[] args) { DataWrap[] data = { new DataWrap(9 , ""), new DataWrap(16 , ""), new DataWrap(21 , "*"), new DataWrap(23 , ""), new DataWrap(30 , ""), new DataWrap(49 , ""), new DataWrap(21 , ""), new DataWrap(30 , "*") }; System.out.println("排序之前:\n" + java.util.Arrays.toString(data)); bubbleSort(data); System.out.println("排序之后:\n" + java.util.Arrays.toString(data)); } }
二、快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public class QuickSort { //将指定数组的i和j索引处的元素交换 private static void swap(DataWrap[] data, int i, int j) { DataWrap tmp; tmp = data[i]; data[i] = data[j]; data[j] = tmp; } //对data数组中从start~end索引范围的子序列进行处理 //使之满足所有小于分界值的放在左边,所有大于分界值的放在右边 private static void subSort(DataWrap[] data , int start , int end) { //需要排序 if (start < end) { //以第一个元素作为分界值 DataWrap base = data[start]; //i从左边搜索,搜索大于分界值的元素的索引 int i = start; //j从右边开始搜索,搜索小于分界值的元素的索引 int j = end + 1; while(true) { //找到大于分界值的元素的索引,或i已经到了end处 while(i < end && data[++i].compareTo(base) <= 0); //找到小于分界值的元素的索引,或j已经到了start处 while(j > start && data[--j].compareTo(base) >= 0); if (i < j) { swap(data , i , j); } else { break; } } swap(data , start , j); //递归左子序列 subSort(data , start , j - 1); //递归右边子序列 subSort(data , j + 1, end); } } public static void quickSort(DataWrap[] data) { subSort(data , 0 , data.length - 1); } public static void main(String[] args) { DataWrap[] data = { new DataWrap(9 , ""), new DataWrap(-16 , ""), new DataWrap(21 , "*"), new DataWrap(23 , ""), new DataWrap(-30 , ""), new DataWrap(-49 , ""), new DataWrap(21 , ""), new DataWrap(30 , "*"), new DataWrap(13 , "*") }; System.out.println("排序之前:\n" + java.util.Arrays.toString(data)); quickSort(data); System.out.println("排序之后:\n" + java.util.Arrays.toString(data)); } }
评论
1 楼
cch2012ky
2013-05-08
while(true)
{
//找到大于分界值的元素的索引,或i已经到了end处
while(i < end && data[++i].compareTo(base) <= 0);
//找到小于分界值的元素的索引,或j已经到了start处
while(j > start && data[--j].compareTo(base) >= 0);
if (i < j)
{
swap(data , i , j);
}
else
{
break;
}
}
中判断条件两个compareTo(base) <= 0最好改为compareTo(base) <0,否则会造成时间复杂度降格为O(n平方)
{
//找到大于分界值的元素的索引,或i已经到了end处
while(i < end && data[++i].compareTo(base) <= 0);
//找到小于分界值的元素的索引,或j已经到了start处
while(j > start && data[--j].compareTo(base) >= 0);
if (i < j)
{
swap(data , i , j);
}
else
{
break;
}
}
中判断条件两个compareTo(base) <= 0最好改为compareTo(base) <0,否则会造成时间复杂度降格为O(n平方)
发表评论
-
利用微软翻译API替代被停用谷歌翻译API
2012-02-13 13:37 10336众所周知,谷歌已经不支持翻译API1版本了,现在提供了A ... -
(转)Java回调实现
2011-12-08 14:38 1129Java回调实现 轮询:过10分钟就到女朋友宿舍前面去看她有 ... -
java实现排序算法之插入排序(直接插入排序、折半插入、shell排序)
2011-09-15 09:29 2479插入排序主要包括直接插入排序、shell排序和折半插入等几种排 ... -
java实现排序算法之选择排序(直接选择排序、堆排序)
2011-09-14 20:44 2630常用的选择排序算法有两种:直接选择排序和堆排序。 一、直接选择 ... -
java 实现数据结构之队列
2011-09-14 15:27 12600队列是一种特殊的线性表,它只允许在表的前端(front)进行删 ... -
java 实现数据结构之线性表
2011-09-14 11:44 10667应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数 ... -
java 实现undo和redo操作链表的一种实现
2011-09-14 10:32 2134今天在iteye论坛逛,发现有这么一道笔试题目:实现一个可以增 ... -
jdbc连接mysql oracle sql server数据库的连接字符串
2011-09-13 10:41 2710jdbc连接mysql oracle sql serv ... -
java 利用label标记退出多重循环
2011-09-10 09:16 12029学过C语言的都知道,有个goto关键字,利用goto关键字可以 ... -
一个小学弟问我的算法问题
2011-09-04 20:08 1627在实验室的本科群中,一个小弟问我一个算法问题。说有1,2, ... -
深入JDK源代码之定时操作Timer类和TimerTask类实现
2011-07-26 14:45 3460Timer类是一种线程设施,可以用来实现某一个时间或某 ... -
(转)Java中对象的深复制(深克隆)和浅复制(浅克隆)
2011-07-25 20:31 11931.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象 ... -
深入JDK源代码之LinkedList类
2011-07-26 09:09 1883public class LinkedList<E> ... -
Java中的transient关键字
2011-07-25 14:36 24882transient说明一个属性是临时的,不会被序列化。 下面是 ... -
深入JDK源代码之Observer接口和Observable类实现观察者模式
2011-07-25 11:46 3407一、何为观察者模式? 观察者模式(有时又被称为发布/ ... -
深入JDK源代码之ArrayList类
2011-07-22 11:19 2911public class ArrayList<E&g ... -
深入JDK源代码之Arrays类中的排序查找算法
2011-07-22 09:58 3941最近在暑假实习, ... -
java 实现数据结构之栈
2011-07-10 21:51 4638在学数据结构课程 ... -
Java定时调度 Timer类和TimerTask类
2011-07-10 15:38 23875Timer类是一种线程设施,可以用来实现某一个时间或某一段 ... -
Calendar类add()与roll()方法的区别
2011-07-06 22:45 10931JDK API中对这两个方法的说明如下: abstract ...
相关推荐
java实现插入排序,交换排序。插入排序包括直接插入排序,折半插入排序和希尔排序。交换排序包括冒泡排序。
用java对常用排序算法进行分析与实现.包含: 插入排序 直接插入排序、希尔排序 • 选择排序 简单选择排序、堆排序 • 交换排序 冒泡排序、快速排序 • 归并排序 • 基数排序
Java各种排序算法集合: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序)
实现了四类排序算法,插入排序、交换排序、选择排序、归并排序,详情请看文档,其中 树形选择排序算法--选择排序、 堆排序--选择排序 这两种算法还没实现,有兴趣的自行解决
java基本排序算法实现,包括快速 选择 插入 希尔 堆 冒泡 交换
以下排序的Java代码实现: 插入排序(直接插入排序、二分法插入排序、希尔排序) 选择排序(简单选择排序、堆排序) 交换排序(冒泡排序、快速排序) 归并排序 基数排序
2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不...
排序算法,JAVA中的快速排序,交换排序,冒泡排序,选择排序等算法的分析
八大排序算法及其实现,具体包括直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序,归并排序,基数排序在内的八种排序算法,同时对各种算法的基本特征做出了详细分析: - 算法基本思想 - 算法的...
2冒泡排序 * 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数, 自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。 即:每当两相邻的数比较后发现它们的排序与排序...
交换排序(冒泡泡排序、快速排序); * 3.选择排序(直接选择排序、堆排序); * 4.归并排序; * 5.基数排序。 * 关于排序方法的选择: * (1)若n较小(如n≤50),可采用直接插入或直接选择排序。 * 当...
程序员可以参考的8大排序算法。1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(基数排序)
Java中排序算法是非常重要的一部分,这里简单分析下冒泡排序和快速排序的实现思路及其代码实现。 常见排序算法时间复杂度表 排序法 平均时间复杂度 最差情形 稳定度 额外空间 备注 冒泡排序 O(n^2) O(n^2) ...
选择排序(直接选择排序,堆排序) 交换排序(冒泡排序,快速排序) 插入排序(直接插入排序,折半插入排序,Shell排序) 归并排序 桶式排序 基数排序
1.排序的定义: 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的...交换排序: 冒泡排序、快速排序 归并排序 基数排序
日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一...
(1)冒泡排序 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。时间复杂度 O(n2),为稳定算法...
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 ...
排序算法的分类如下: * 1.插入排序(直接插入排序、折半插入排序、希尔排序);...交换排序(冒泡排序、快速排序); * 3.选择排序(直接选择排序、堆排序); * 4.归并排序; * 5.基数排序。