- 浏览: 152492 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
MCQCM:
你的代码有个小问题,不信,你试试abceaefkbn。正确如下 ...
求字符串的最长不重复子串 -
cherry728:
如果服务由多个操作组成,那要怎么办呢。这些操作是需要顺序执行的 ...
一起学BPEL实例教程一(原创) -
zoukailiang0:
请问上面代码中的type变量是怎么获取的啊?我是用默认的pro ...
gef中的属性视图小结 -
我爱死了java:
楼主你好,看你的总结很感谢,不知道你可以把jaf-1_1-fr ...
axis1.4 使用笔记(1) -
nannan408:
ByteArrayOutputStream b ...
java clone方法的使用
差不多开始要找工作了,因此今天特意对排序算法进行了复习,把一些心得记录下来。先给出各种算法的原理和实现,最后再做些总结吧。
1.冒泡排序,这个应该是大家都熟悉的。(都是从小到大排)
原理:简单理解就是依次把最小的数往上冒。
public void bubbleSort(int[] data) { //较小的数往前冒,每一次外层循环,保证第i个数是第i大的 for(int i=0;i<data.length;i++){ for(int j=i+1;j<data.length;j++){ //如果后面有比data[i]小的,就交换过来 if(data[i]>data[j]) swap(data, i, j); } }
其中的swap方法表示交换数组中两个位置的数据,代码如下:
private void swap(int[] data, int x, int y) { int temp = data[x]; data[x] = data[y]; data[y] = temp; }
2.选择排序
个人感觉可以看作是冒泡排序方法的改进版。冒泡排序是只要后面的比当前的小就交换,而选择排序是从后面没排好的找到最小值的位置,最后只需要交换一次。
public void selectSort(int[] data) { int index;//当前最小值的位置 for(int i=0;i<data.length;i++){ index=i; for(int j=i+1;j<data.length;j++){ if(data[index]>data[j]){ index=j;//记录最小位置 } } swap(data, i, index);//把当前最小值保存到第i个位置 } }
3.插入排序
这种方法的思路是,将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表。也就是说程序开始把第一个数当作一个有序表,然后依次加入后面的n-1个数,每加入一个数,都要保证得到的序列是排好序的。
public void insertSort(int[] data) { for (int i = 1; i < data.length; i++) { // 把第i个位置的数插到前i-1个数的某个位置,保证前i个数排好序 int temp = data[i];// 首先保存第i个数的值 int j; for (j = i; j > 0; j--) { if (data[j - 1] > temp)// 如果前面的数比第i个位置的数大,说明得往后移 data[j] = data[j - 1]; else break; } data[j] = temp;// 找到合适位置后,插入即可 } }
4.快速排序
从数组中随意找出一个数(这里取数组的第一个数),将大于和小于它的数分置于其两边,然后再将其两边的数组都以同样的方法执行 .主要分三步:1) 从数列中挑出一个元素,称为 "基准"(pivot) 2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,这个称为分割(partition)操作。3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
private void quickSort(int data[], int low, int high) { int i, j, pivot; i = low; j = high; if (low < high) {// 通过这个条件结束循环 // 第一步,选择基准,这里就选择第一个数 pivot = data[i]; //第二步,通过下面这个循环,把数组中小于基准的放到数组左边,大于基准的放到数组右边 while (i < j) { // 1.从右往左找到第一个小于pivot的元素 while (i < j && data[j] > pivot) j--; if (i < j) { data[i] = data[j];// 第i个元素保存右边第一个小于pivot的 i++; } //2.从左往右找,找到第一个大于pivot的元素 while (i < j && data[i] < pivot) i++; if (i < j) { data[j] = data[i];// 第j个元素保存左边第一个大于pivot的 j--; } } data[i] = pivot;//第i个位置就是基准的位置 //第三步,递归调用该算法,把基准左边,右边的分别排序 quickSort(data, low, i - 1); quickSort(data, i + 1, high); } }
5.希尔排序(shell)缩小增量排序
Shell排序法是对相邻指定距离(称为间隔)的元素进行比较,直到使用当前间隔进行比较的元素都按顺序排序为止.Shell把间隔缩小一半,然后继续处理,当间隔最终变为1,并且不再出现变化时,Shell排序也就完成了其处理过程.实际上就是根据增量把数组分成几部分,每部分进行插入排序即可。个人理解对每个部分的排序可以采取任何的简单排序方法。
public void shellSort(int[] data) { //这里把增量初始化为数组长度的一半,然后依次减半,当然也可以传进一个增量数组 for (int inc = data.length / 2; inc > 2; inc /= 2) { for (int j = 0; j < inc; j++) { shellInsertSort(data, j, inc);//每一组内进行插入排序 } } shellInsertSort(data, 0, 1);//最后进行一次所有元素的排序 } //这个算法其实就是一次插入排序,只不过有个增量inc private void shellInsertSort(int[] data, int start, int inc) { int temp; for (int i = start+inc; i < data.length; i+=inc) { // 把第i个位置的数插到前i-1个数的某个位置,保证前i个数排好序 temp = data[i];// 首先保存第i个数的值 int j; for (j = i; j >=inc; j-=inc) { if (data[j - inc] > temp)// 如果前面的数比第i个位置的数大,说明得往后移 data[j] = data[j - inc]; else break; } data[j] = temp;// 找到合适位置后,插入即可 } }
从代码中可以看出,组内的排序方法和前面讲过的插入排序完全一样。
6.归并排序
算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个
序列。
归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。
/** * @param data 是需要排序的原数组 * @param temp 是个临时数组,数组大小和data一样 * @param left 左边界 * @param right 右边界 */ private void mergeSort(int[] data, int[] temp, int left, int right) { if (left >= right)//就剩一个元素时,直接返回,直接合并就行了。 return; int mid = (left + right) / 2;//获得数组的中间位置 mergeSort(data, temp, left, mid);//对左半部分递归调用排序算法 mergeSort(data, temp, mid + 1, right);//对右半部分分递归 //这一步是把原数组中的值保存到临时数组中 for (int i = left; i <= right; i++) { temp[i] = data[i]; } //下面是完成合并,也就是把左右两个有序的数组合并到一个数组中,并使之有序 int l= left; int r = mid + 1; for (int cur = left; cur <= right; cur++) { if (l == mid + 1)//如果第一个数组已经全部比较完了,那么我们只要直接复制第二个数组的条目到合并数组中即可 data[cur] = temp[r++]; else if (r > right)//如果第二个数组已经全部比较完了,那么我们只要直接复制第一个数组的条目到合并数组中即可 data[cur] = temp[l++]; else if (temp[l] < temp[r])//把比较的两个条目中关键值小的放到合并数组中 data[cur] = temp[l++]; else data[cur] = temp[r++]; } }
7、堆排序
发表评论
-
用友软件的两道笔试题(找最大文件和倒水问题)
2010-10-27 17:27 2148题目比较基础,不是很难,但也有很多需要注意的地方,先看题目吧: ... -
求两数的最大公约数
2010-10-22 16:38 1202来源:编程之美2.7 问题:求两数的最大公约数 //求两个 ... -
1的数目
2010-10-22 14:23 875来源:编程之美2.4 题目:给定一个十进制正整数N,写下从1 ... -
寻找发帖“水王”
2010-10-22 13:28 1768来源:编程之美2.3 题目:该"水王"发 ... -
不要被阶乘吓倒
2010-10-22 11:40 1128来源:编程之美 2.2 题目:1.给定一个整数N,求N!末尾 ... -
Hibernate中HQL语句的一般写法
2010-07-14 15:02 1112这两天写了不少HQL语句,总结起来都是四步,在这四步的基础上加 ... -
Eclipse客户端程序中多线程的使用
2010-03-10 16:14 883Eclipse作为一个 ... -
java clone方法的使用
2010-01-20 13:59 1644这几天在编程的过程中突然发现自己对java的参数传递 ... -
字符串匹配算法学习
2009-12-21 21:13 9721.KMP算法 http://hi.baidu.com/ne ... -
java中判断一个字符串是否是一个整数的几个方法
2009-12-06 14:07 87311.使用类型转换判断 try { String st ... -
Java集合的Stack、Queue、Map的遍历
2009-12-05 14:58 3481一、Map的遍历 import java.util.Hash ... -
数组和列表之间的转换
2009-12-05 14:42 1759常用到,所以总结下,都是以字符串数组为例: 1.数组转换成列 ... -
List中toArray()方法要注意的地方
2009-12-03 15:51 2265今天为了把一个ArrayList直接转化为一个String数组 ... -
java字符串处理的一些总结
2009-11-19 10:49 12091.字符串首字母大写: String str = &qu ... -
爬虫种子
2009-11-14 10:44 1387最近几天用来爬虫的种子: http://www.webser ... -
java中集合类的使用
2009-09-28 15:32 718以下是几个与java中集合的使用相关的文章: 1.http: ... -
Java中删除目录和目录下所有文件
2009-09-13 10:43 1206public void del(String filepath ... -
Java中static、final用法小结
2009-09-11 17:50 1549一、final 1.final变量: ... -
常用的一些名字空间
2009-07-18 10:41 818xmlns:SOAP-ENV="http://sch ... -
Map.Entry的使用
2009-06-16 12:29 961你是否已经对每次从Ma ...
相关推荐
### Java版本排序算法详解 #### 插入排序 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在Java中,我们可以创建一个`...
Java排序算法实现 Java排序算法实现 Java排序算法实现
Java排序算法大全是一份专为Java开发者准备的学习资源,涵盖了各种经典的排序算法,旨在帮助初学者和有经验的程序员深入理解排序的原理和实现。排序是计算机科学中的基础且重要的概念,它在数据处理、数据库操作、...
排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际...
java排序算法java排序算法插入选择冒泡java排序算法插入选择冒泡
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
本文将对Java中的九种基本排序算法进行深入的总结和探讨,包括它们的工作原理、优缺点以及适用场景。 首先,我们来看堆排序(HeapSort)。堆排序是一种基于比较的排序算法,它利用了完全二叉树的特性,通过构建最大...
### JAVA排序算法总结 在计算机科学领域,排序算法是数据处理和分析中极其重要的组成部分,尤其是在使用Java语言进行开发时。本文将针对常用的几种排序算法进行详细的总结与解析,包括它们的基本原理、时间复杂度、...
根据提供的文件信息,我们可以总结出以下几个关键的排序算法知识点: ### 1. 插入排序 (Insertion Sort) 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后...
Java作为广泛应用的编程语言,其对排序算法的支持使得开发者能够高效地处理大量数据。本篇文章将详细探讨Java中冒泡排序、选择排序、快速排序以及插入排序这四大基本排序算法,并结合代码和动画演示来帮助理解它们的...
在Java编程语言中,排序算法是数据结构与算法学习中的重要组成部分。本实验通过生成大量随机数并写入文件,然后使用四种不同的排序算法进行排序,以比较它们的效率。以下是对这四种排序算法的详细解释: 1. **冒泡...
冒泡排序和快速排序是两种基础但广泛使用的数据排序算法。冒泡排序由于其简单直观的特性,易于理解和实现,而快速排序则以其较高的效率在数据量较大时展现出优势。 首先,让我们来看冒泡排序算法。冒泡排序通过重复...
这个名为"Java各种排序算法代码.zip"的压缩包包含了一系列实现不同排序算法的Java源代码。排序算法是计算机科学中的基本概念,用于对一组数据进行排列。下面将详细讨论这些算法及其在Java中的实现。 1. 冒泡排序...
在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理大量数据。本篇将深入探讨Java中实现的几种...
【Java排序算法详细整理】 在计算机科学中,排序算法是用于对一组数据进行排列的算法。在Java中,实现各种排序算法有助于理解数据结构和算法的原理,同时也能提高编程能力。以下是对Java中常见的几种排序算法的详细...
在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理数据。本资源包含的是Java实现的各种常见排序...
本资源“Java排序算法源代码”提供了一系列经典的排序算法实现,包括冒泡排序、插入排序、选择排序、希尔排序和快速排序,全部用Java语言编写。这些算法对于学习和理解排序原理以及优化代码性能至关重要。 1. **...