一、冒泡排序(BubbleSort)
1. 基本思想:

设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,

其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素

不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的”最前面”。

2.算法实现

package 冒泡排序;
/**
* 相邻数据两两比较,大的排上面,小的排下面 第一次可排出最小的值
* 第二次排出第二小的值
* 第三次排出第三小的值
* 以此类推排出顺序
*
* 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)
稳定性:稳定
* @author Administrator
*
*/
public class BubbleSort {
//初级版(从左往右比较)
/**
* 第0次排序==0546897231
第1次排序==0156897432
第2次排序==0126897543
第3次排序==0123897654
第4次排序==0123498765
第5次排序==0123459876
第6次排序==0123456987
第7次排序==0123456798
第8次排序==0123456789
第9次排序==0123456789
最终排序==0123456789
* 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)
稳定性:稳定
*/
public static void sort1(int[] num){
int i,j,temp;
for(i=0;i<num.length;i++){
//第一次i=0,排出最小的值0
//第二次i=1,排出第二小的值1
for(j=i+1;j<num.length;j++){
if (num[i]>num[j]) {
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
}
}
//中级版(从右往左比较)
public static void sort2(int[] num){
int i,j,temp;
for(i=0;i<num.length;i++){ for(j=num.length-1;j>i;j--){
if (num[j-1]>num[j]) {
temp=num[j-1];
num[j-1]=num[j];
num[j]=temp;
}
}
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2); }
//终极版
public static void sort3(int[] num){
int i,j,temp;
boolean flag=true;
for(i=0;i<num.length&&flag;i++){
flag=false;
for(j=num.length-1;j>i;j--){
//从右往左两两相比较,大于说明可以交换数值,小于使用flag=false直接跳过
if (num[j-1]>num[j]) {
temp=num[j-1];
num[j-1]=num[j];
num[j]=temp;
flag=true;
}
}
}
} public static void main(String args[]){
int[] num={5,2,4,6,8,9,7,1,3,0};
// sort1(num);
// sort2(num);
sort3(num);
} }

二、选择排序
1. 基本思想:
从未排好的部分的第一个作为最小(最大)的,然后依次和剩余的比较,如果有更小(更大)的,记下下标,

以此作为新的最小(最大)值,继续比较,一趟结束后,可以得到最小值。

例如:初始序列:{49 27 65 97 76 12 38}
  第1趟:12与49交换:12{27 65 97 76 49 38}(选择第一个数与后面剩下的数两两比较,交互位置,排出第一个最小值)
  第2趟:27不动 :12 27{65 97 76 49 38}(第一个数已经排好,选择第二个数与后面剩下的数两两比较,交互位置,排出第二个最小值)
  第3趟:65与38交换:12 27 38{97 76 49 65}(第二个数已经排好,选择第三个数与后面剩下的数两两比较,交互位置,排出第三个最小值)
  第4趟:97与49交换:12 27 38 49{76 97 65}以此类推
  第5趟:76与65交换:12 27 38 49 65{97 76}
  第6趟:97与76交换:12 27 38 49 65 76 97 完成

2. 算法实现:

package 简单选择排序;
/**
* 选择一个min做基准和其他的数据相互比较,如果比较的数大则把当前的数的赋值给min
* 以此类推
* @author Administrator
*
*/
public class SelectSort {
//简单选择排序,选择一个min做基准和其他的数据相互比较
/**
* 最优时间复杂度:O(n2)
最坏时间复杂度:O(n2)
稳定性:不稳定(考虑升序每次选择最大的情况)
* @param num
*/
public static void sort(int[] num){
int i,j,min,temp;
for(i=0;i<num.length;i++){
min=i;//将当前下标定义为最小值下标
for(j=i+1;j<num.length;j++){
if (num[min]>num[j]) {
min=j;//如果有小于当前最小值的关键字,将此关键字的下标赋值给min
}
}
if (i!=min) {//若min不等于i,说明min发生改变,即上面相互比较的为true,即有最小值,交换
temp=num[i];
num[i]=num[min];
num[min]=temp;
}
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2); } public static void main(String args[]){
int[] num={5,2,4,6,8,9,7,1,3,0};
sort(num); }
}

三、插入排序(Insertion Sort)
1. 基本思想:

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,

这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,

从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。

  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
【示例】:
[初始关键字]    [49] 38 65 97 76 13 27 49(选择49)
    J=2(38)   [38 49] 65 97 76 13 27 49(选择38插入到49前面)
    J=3(65)   [38 49 65] 97 76 13 27 49(选择65插入到49前面)
    J=4(97)   [38 49 65 97] 76 13 27 49(选择97插入到65前面)
    J=5(76)   [38 49 65 76 97] 13 27 49(以此类推)
    J=6(13)   [13 38 49 65 76 97] 27 49
    J=7(27)   [13 27 38 49 65 76 97] 49
    J=8(49)   [13 27 38 49 49 65 76 97] 

2. 算法实现:

package 直接插入排序;

public class InsertSort {
/**
* 插入排序
*
* @paramarr
* @return
*/
public static void insert(int[] num)
{
for(int i=1;i<num.length;i++) //n-1此扫描,依次向前插入n-1个元素
{
int temp=num[i]; //每趟将num[i]插入到前面的排序子序列中
int j;
for(j=i-1;j>=0&&temp<num[j];j--)
{
num[j+1]=num[j]; //将前面较大的元素向后移动
}
num[j+1]=temp; //temp值到达插入位置
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] num = { 5, 2, 4, 6, 8, 9, 7, 1, 3, 0 };
insert(num);
}
}

  

各种排序算法思想复杂度及其java程序实现的更多相关文章

  1. 十大经典排序算法详细总结(含JAVA代码实现)

    原文出处:http://www.cnblogs.com/guoyaohua/p/8600214.html 0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 ...

  2. JAVA十大经典排序算法最强总结(含JAVA代码实现)

    0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...

  3. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...

  4. 排序算法入门之快速排序(java实现)

    快速排序也是一种分治的排序算法.快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序,会需要一个额外的数组:而快速排序的排序方式是当两个子数组都有序时 ...

  5. 排序算法入门之堆排序(Java实现)

    堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...

  6. 排序算法之直接插入排序(java实现)

    package com.javaTest300; import java.util.Arrays; public class Test041 { public static void main(Str ...

  7. 排序算法入门之归并排序(java实现)

    归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...

  8. 排序算法入门之插入排序(java实现)

    插入排序思想:相当于插入元素,对于第i个元素,i之前的元素已经是有序的了,这时候将第i个元素依次与前面元素比较,插入合适的位置.

  9. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-008排序算法的复杂度(比较次数的上下限)

    一. 1. 2.

随机推荐

  1. SQL取某个字符串最后一次出现的位置后面的字符串方法

    --sql怎么取某个字符串最后一次出现的位置后面的字符串 declare @s varchar(max); set @s = 'fj/2016815/2016081553677565.pdf'; se ...

  2. TFS二次开发01——TeamProjectsPicher

    作为TFS的二次开发,首先要做的第一件工作是怎样连接到TFS并选择我们要下载的项目. 本文就此介绍一下使用TeamProjectsPicher 连接到TFS服务器. 添加引用 Microsoft.Te ...

  3. mysql 数据操作 单表查询 group by 分组 目录

    mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...

  4. 一、Mosquitto 介绍&安装

    一.Mosquitto 介绍 一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的 ...

  5. python 面向对象编程学习总结

    面向对象是个抽象的东西,概念比较多,下面会一一介绍. 一.类和实例 类(Class)和实例(Instance)是面向对象最重要的概念. 类是指抽象出的模板.实例则是根据类创建出来的具体的“对象”,每个 ...

  6. docker 容器目录挂载 | 进出容器

    docker run --name wnginx -d -p 9001:80 -v /home/www:/usr/share/nginx/html nginx --name   别名 -d      ...

  7. 应用连接mysql8.0注意事项

    mysql8.0在安装过程中会让你选择一个Authentication Method,如果你选择上面的更强的授权机制,那么就会出现下面的情况 图片来源:https://blog.csdn.net/qq ...

  8. springcloud21---Config-bus实现配置自动刷新

    Pivotal(毕威拓)有VMware和EMC成立的. RabbitMQ是由ERlang(爱立信开发的,面向并发的编程语言),安装RabbitMQ先要安装ERlang. package com.itm ...

  9. PHP设计模式_单例模式

    了解 单例设计模式用于限制特定对象只能被实例化创建一次,有且只有一个此类型的资源.例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销 ...

  10. Windows共享文件

    通常局域网中处于同一工作组或同一域的计算机只要右键设置文件夹共享即可,但跨工作组或跨域的共享就需要设置一番了. 一.启用共享 二.关闭共享密码保护 这是英文版系统示例,中文版一样,就是在第一步向下拉一 ...