来源:
http://blog.csdn.net/fenglibing/article/details/1756473
算法复杂度
http://blog.sina.com.cn/s/blog_771849d301010ta0.html
快速排序:
http://wangyu.iteye.com/blog/198474
1、冒泡排序 Bubble Sort
最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。这个算法可实现如下。
算法如下:
/**
*冒泡排序
*@paramsrc待排序数组
*/
void doBubbleSort(int[] src)
{
int len=src.length;
for(int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
int temp;
if(src[i]>src[j])
{
temp=src[j];
src[j]=src[i];
src[i]=temp;
}
}
printResult(i,src);
}
}
2、选择排序 Selection Sort
选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。
当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大者与其首记录交换位置,按从大到小的顺序进行排序处理。
算法如下:
/**
*选择排序
*@paramsrc待排序的数组
*/
void doChooseSort(int[] src)
{
int len=src.length;
int temp;
for(int i=0;i<len;i++)
{
temp=src[i];
int j;
int samllestLocation=i;//最小数的下标
for(j=i+1;j<len;j++)
{
if(src[j]<temp)
{
temp=src[j];//取出最小值
samllestLocation=j;//取出最小值所在下标
}
}
src[samllestLocation]=src[i];
src[i]=temp;
printResult(i,src);
}
}
3、插入排序 Insertion Sort
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
简言之,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。
图1 对4个元素进行插入排序
在下面的插入排序算法中,为了写程序方便我们可以引入一个哨兵元素L[0],它小于L[1..n]中任一记录。所以,我们设元素的类型ElementType中有一个常量-∞,它比可能出现的任何记录都小。如果常量-∞不好事先确定,就必须在决定L[i]是否向前移动之前检查当前位置是否为1,若当前位置已经为1时就应结束第i遍的处理。另一个办法是在第i遍处理开始时,就将L[i]放入L[0]中,这样也可以保证在适当的时候结束第i遍处理。下面的算法中将对当前位置进行判断。
算法如下:
/**
*插入排序(WHILE循环实现)
*@paramsrc待排序数组
*/
void doInsertSort1(int[] src)
{
int len=src.length;
for(int i=1;i<len;i++)
{
int temp=src[i];
int j=i;
while(src[j-1]>temp)
{
src[j]=src[j-1];
j--;
if(j<=0)
break;
}
src[j]=temp;
printResult(i+1,src);
}
}
/**
*插入排序(FOR循环实现)
*@paramsrc待排序数组
*/
void doInsertSort2(int[] src)
{
int len=src.length;
for(int i=1;i<len;i++)
{
int j;
int temp=src[i];
for(j=i;j>0;j--)
{
if(src[j-1]>temp)
{
src[j]=src[j-1];
}else//如果当前的数,不小前面的数,那就说明不小于前面所有的数,
//因为前面已经是排好了序的,所以直接通出当前一轮的比较
break;
}
src[j]=temp;
printResult(i,src);
}
}
快速排序:
public class QuickSort {
public static void main(String[] args) {
Random random=new Random();
int[] pData=new int[10];
for(int i=0;i<pData.length;i++){ //随机生成10个排序数
Integer a =random.nextInt(100);
pData[i]= a;
System.out.print(pData[i]+" ");
}
System.out.println();
int left=0;
int right=pData.length-1;
Sort(pData,left,right);
for(int i=0;i<pData.length;i++){
System.out.print(pData[i]+" ");
}
System.out.println();
}
public static int[] Sort(int[] pData, int left, int right){
int middle,strTemp;
int i = left;
int j = right;
middle = pData[(left+right)/2];
do{
while((pData[i]<middle) && (i<right))
i++;
while((pData[j]>middle) && (j>left))
j--;
if(i<=j){
strTemp = pData[i];
pData[i] = pData[j];
pData[j] = strTemp;
i++;
j--;
}
for(int k=0;k<pData.length;k++){
System.out.print(pData[k]+" ");
}
System.out.println();
}while(i<j);//如果两边扫描的下标交错,完成一次排序
if(left<j)
Sort(pData,left,j); //递归调用
if(right>i)
Sort(pData,i,right); //递归调用
return pData;
}
}
http://blog.csdn.net/fenglibing/article/details/1756473
算法复杂度
http://blog.sina.com.cn/s/blog_771849d301010ta0.html
快速排序:
http://wangyu.iteye.com/blog/198474
1、冒泡排序 Bubble Sort
最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。这个算法可实现如下。
算法如下:
/**
*冒泡排序
*@paramsrc待排序数组
*/
void doBubbleSort(int[] src)
{
int len=src.length;
for(int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
int temp;
if(src[i]>src[j])
{
temp=src[j];
src[j]=src[i];
src[i]=temp;
}
}
printResult(i,src);
}
}
2、选择排序 Selection Sort
选择排序的基本思想是:对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。
当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大者与其首记录交换位置,按从大到小的顺序进行排序处理。
算法如下:
/**
*选择排序
*@paramsrc待排序的数组
*/
void doChooseSort(int[] src)
{
int len=src.length;
int temp;
for(int i=0;i<len;i++)
{
temp=src[i];
int j;
int samllestLocation=i;//最小数的下标
for(j=i+1;j<len;j++)
{
if(src[j]<temp)
{
temp=src[j];//取出最小值
samllestLocation=j;//取出最小值所在下标
}
}
src[samllestLocation]=src[i];
src[i]=temp;
printResult(i,src);
}
}
3、插入排序 Insertion Sort
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
简言之,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。
图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。
图1 对4个元素进行插入排序
在下面的插入排序算法中,为了写程序方便我们可以引入一个哨兵元素L[0],它小于L[1..n]中任一记录。所以,我们设元素的类型ElementType中有一个常量-∞,它比可能出现的任何记录都小。如果常量-∞不好事先确定,就必须在决定L[i]是否向前移动之前检查当前位置是否为1,若当前位置已经为1时就应结束第i遍的处理。另一个办法是在第i遍处理开始时,就将L[i]放入L[0]中,这样也可以保证在适当的时候结束第i遍处理。下面的算法中将对当前位置进行判断。
算法如下:
/**
*插入排序(WHILE循环实现)
*@paramsrc待排序数组
*/
void doInsertSort1(int[] src)
{
int len=src.length;
for(int i=1;i<len;i++)
{
int temp=src[i];
int j=i;
while(src[j-1]>temp)
{
src[j]=src[j-1];
j--;
if(j<=0)
break;
}
src[j]=temp;
printResult(i+1,src);
}
}
/**
*插入排序(FOR循环实现)
*@paramsrc待排序数组
*/
void doInsertSort2(int[] src)
{
int len=src.length;
for(int i=1;i<len;i++)
{
int j;
int temp=src[i];
for(j=i;j>0;j--)
{
if(src[j-1]>temp)
{
src[j]=src[j-1];
}else//如果当前的数,不小前面的数,那就说明不小于前面所有的数,
//因为前面已经是排好了序的,所以直接通出当前一轮的比较
break;
}
src[j]=temp;
printResult(i,src);
}
}
快速排序:
public class QuickSort {
public static void main(String[] args) {
Random random=new Random();
int[] pData=new int[10];
for(int i=0;i<pData.length;i++){ //随机生成10个排序数
Integer a =random.nextInt(100);
pData[i]= a;
System.out.print(pData[i]+" ");
}
System.out.println();
int left=0;
int right=pData.length-1;
Sort(pData,left,right);
for(int i=0;i<pData.length;i++){
System.out.print(pData[i]+" ");
}
System.out.println();
}
public static int[] Sort(int[] pData, int left, int right){
int middle,strTemp;
int i = left;
int j = right;
middle = pData[(left+right)/2];
do{
while((pData[i]<middle) && (i<right))
i++;
while((pData[j]>middle) && (j>left))
j--;
if(i<=j){
strTemp = pData[i];
pData[i] = pData[j];
pData[j] = strTemp;
i++;
j--;
}
for(int k=0;k<pData.length;k++){
System.out.print(pData[k]+" ");
}
System.out.println();
}while(i<j);//如果两边扫描的下标交错,完成一次排序
if(left<j)
Sort(pData,left,j); //递归调用
if(right>i)
Sort(pData,i,right); //递归调用
return pData;
}
}
发表评论
-
jvm default value
2015-07-17 21:32 594http://www.cnblogs.com/redcreen ... -
加密解密
2013-10-10 14:55 475Java安全之对称加密、非对称加密、数字签名 http ... -
xml 文档 xsd与dtd ,webservices
2013-08-15 19:31 500http://www.ibm.com/developerw ... -
tomcat
2013-08-14 19:11 498tomcat工作原理 http://www.cnblog ... -
类加载器
2013-08-14 19:02 560类加载器:http://blog.csdn.ne ... -
Java中堆内存和栈内存详解
2013-05-15 18:15 564http://www.cnblogs.com/whgw/a ... -
jvm 类编译 加载 监控工具
2013-05-06 22:42 545http://simpleframework.net/bl ... -
print gc parameter
2013-05-01 21:43 512http://lanmaohome.blog.sohu.com ... -
JDK7 AIO (非阻塞IO)实现大并发TCPServer和TCPClient
2013-04-10 17:56 1064http://blog.sina.com.cn/s/blo ... -
CopyOnWriteArrayList LinkedBlockingQueue BlockingQueue
2013-04-09 16:54 665http://blog.163.com/among_198 ... -
java 死锁解决方式
2013-04-08 21:16 691解决方式: 1)尽量使用tryLock(long time ... -
虚拟机调优
2013-04-08 11:58 0通过对JVM的参数设置,达到控制gc回收的频率以 ... -
cglib
2013-03-31 18:45 584文章come from : http://www.uml. ... -
linux 存储过程
2013-03-27 14:06 781出处:http://blog.csdn.net/qinde0 ... -
比较好的 JMS讲解,java
2013-05-12 22:40 474http://blog.csdn.net/zhangxs_ ... -
java 集合类
2013-03-25 14:31 614出处:http://blog.csdn.net/touchS ... -
java 集合类
2013-03-25 13:57 555出处:http://developer.51cto.c ... -
Java NIO
2013-03-21 13:36 688原文出自【比特网】,转载请保留原文链接:http://sof ... -
HashMap原理及冲突之简谈
2013-03-19 16:09 682文章出处: http://space.itpub.net/ ... -
HashMap 结构
2013-03-19 15:24 700文章出处: http://java.chinaitlab. ...
相关推荐
在本系统中,我们主要实现了五种常用的排序算法:冒泡排序法、快速排序法、直接插入排序法、折半插入排序法和树形选择排序法。这些算法都是在计算机科学中最基本和最重要的排序算法,广泛应用于各种数据处理和分析...
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
常见的排序算法有插入排序、快速排序、选择堆积排序法等。 插入排序算法是一种简单的排序算法,适用于小规模的数据结构。该算法将数据结构分成已排序部分和未排序部分,并将未排序部分的元素插入到已排序部分中。...
在计算机科学领域,排序算法是数据处理中的核心部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型...
希尔排序是一种基于插入排序的算法,通过将待排序的数组元素按某个增量分组,然后对每组使用直接插入排序算法排序。随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止...
本篇文章将介绍一种经典的排序算法——**合并排序法**(Merge Sort),并通过C语言实现该算法。合并排序是一种非常有效的排序方法,其核心思想是分治法:将数据分为若干个子集,对这些子集分别进行排序,最后将排序...
最快的排序算法 最快的内部排序法—桶排序法,排序算法数据结构
在IT领域,排序算法是计算机科学中的基础但至关重要的概念,尤其在数据处理和算法设计中扮演着核心角色。本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡...
最快的排序算法 最快的内部排序法—桶排序法 (1),排序算法数据结构
在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
根据给定文件的信息,本文将深入探讨C语言中的两种经典排序方法:插入排序法与冒泡排序法。这两种方法在实际编程中应用广泛,对于理解数据结构与算法的基础概念至关重要。 ### 一、冒泡排序法 #### 1.1 基本原理 ...
双向起泡排序法是一种在链表结构中实现的排序算法,尤其适用于双向链表。它借鉴了传统冒泡排序的基本思想,但在链表环境中进行了优化,以提高效率。本篇文章将详细探讨双向起泡排序法及其在带头结点的双向链表中的...
六种排序算法的排序系统 本篇文章主要讲解了六种排序算法的排序系统,包括插入排序、冒泡排序、选择排序、快速排序、堆排序和归并排序。该系统可以让用户选择六种排序算法中的任意一个,并输出结果。 插入排序 ...
在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在数据处理和数据分析中起着关键作用。本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并...
在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让...
在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、...
时间复杂度用于衡量排序算法的效率,通常以大O表示法来表示。文档中提到了几种不同排序算法的时间复杂度: - **O(n²)**:插入排序、冒泡排序和选择排序的时间复杂度均为O(n²),这意味着随着数据量的增加,这些...
排序算法是计算机科学中最基础和重要的算法之一,用于将一组数据按照特定的顺序进行排列。本文将对几种常见的内部排序算法和外部排序算法进行详细总结。 首先,排序的基本定义是:给定一个包含n个记录的序列,其...
在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...