一、冒泡排序(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. Windows 7 Ultimate(旗舰版)SP1 32/64位官方原版下载地址

    MSDN于2011年5月12日,最新发布简体中文Windows 7 Ultimate 旗舰版 SP1 DVD镜像安装包,分32位和64位两个版本.最新发行代号分别是:677486(32位),67740 ...

  2. Only a type can be imported. classname resolves to a package的解决

    Only a type can be imported. l1.l2.MyClass resolves to a package ==========这里是解决方案=============== 把生 ...

  3. Python开发【笔记】:接口

    接口 什么是接口 ? 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部 ...

  4. 数据库SQL优化大总结之百万级数据库优化方案(转)

    add by zhj: 作者没有指定是哪个数据库,这只是一个近似通用的总结.对于某个特定的数据库,有些条目可能并不适用. 原文:http://www.cnblogs.com/yunfeifei/p/3 ...

  5. 产品开发过程描述xmind

  6. linux/Mac使用du查看目录占用的磁盘大小

    [1]du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为: du -sh [2]若要查看一个目录下每个文件和文件夹的磁盘占用空间,使用如下命令: du -ah --max-depth=1 ...

  7. Deep Learning(1)

    深度学习是机器学习研究中的一个新的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本.深度学习是无监督学习的一种. 深度学习的概念源于人工神经网络的 ...

  8. ReactNative生成android平台的bundle文件命令

    ReactNative生成android平台的bundle文件命令 2016年11月03日 23:23:28 阅读数:4869 注:如果assets文件没有正确生成,需要手机创建或授权 网上的其它的很 ...

  9. Java 和 Python 解析动态 key 的 JSON 数据

    一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...

  10. 2017-2018 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2017) Solution

    A:Concerts 题意:给出一个串T, 一个串S,求串S中有多少个串T,可以重复,但是两个字符间的距离要满足给出的数据要求 思路:先顺序统计第一个T中的字符在S中有多少个,然后对于第二位的以及后面 ...