本篇文章,先从数据结构开始,一边总结,一边反思,寻求最优解。

本文简单温习下最基础的三类算法:选择,冒泡,插入。先定义一个交换数组作为备用:

/**

* 交换数组元素

* @param arr

* @param a

* @param b

*/

public static void swap(int []arr,int a, int b){

arr[a] = arr[a] + arr[b];

arr[b] = arr[a] - arr[b];

arr[a] = arr[a] - arr[b];

}

注意:以下排序均为从小到大排序

1.简单选择排序

选择排序包括简单选择排序和堆排序,这里先介绍简单选择排序。

简单选择排序的基本思想:假设排序表为L[1...n],第i趟排序即从L[i...n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使整个排序表有序。

简单选择排序算法的java代码实现如下:

/**

* 简单选择排序

* @param A

* @param n

*/

public static void selectSort(int A[],int n){

        for(int i=0;i<n-1;i++){      //一共进行n-1趟

             int min = i;             //记录最小元素的值

             for(int j=i+1;j<n;j++){  //在A[i...n-1]中选择最小的元素

                  if(A[j]<A[min]){     //更新最小元素位置

min = j;

}

}

             if(min!=i){

                 swap(A,i,min);       //与第i个位置交换

}

}

}

简单选择排序的性能分析如下:

空间效率:仅使用常数个辅助单元,故而空间效率为O(1)。

时间效率:从以上代码可以看出,元素移动的次数很少,但元素间的比较次数与序列的初始状态无关,始终是n(n-1)/2次,所以时间复杂度始终是O(n∧2).

稳定性:在第i趟找到最小元素后,和第i个元素交换,可能会导致第i个元素与其含有相同关键字元素的相对位置发生改变。因此,简单选择排序是不稳定的排序方法。

2.冒泡排序

    冒泡排序是交换排序的一种,交换排序还包括快速排序(以后再介绍)。

冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。

冒泡排序算法的java代码实现如下:

/**

* 冒泡排序

* @param A

* @param n

*/

public static void bubbleSort(int A[],int n){

       for(int i=0;i<n-1;i++){

             boolean flag = false;    //表示本趟冒泡是否发生交换的标志

             for(int j=n-1;j>i;j--){  //一趟冒泡过程

                   if(A[j-1]>A[j]){     //若为逆序

                        swap(A,j-1,j);   //交换

flag = true;

}

              if(flag == false){

                   return;          //本趟遍历后没有发生交换,说明表已经有序

}

}

}

}

冒泡排序的性能分析如下:

空间效率:仅使用常数个辅助单元,故而空间效率为O(1)。

时间效率:时间复杂度始终是O(n∧2).(老生常谈了,具体过程就不赘述了)

稳定性:由于当i>j且A[i]=A[j]时,不会交换两个元素,从而冒泡排序是一个稳定的排序方法。

3.直接插入排序

插入排序包括直接插入排序,折半插入排序和希尔排序,这里先介绍直接插入排序。

直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

直接插入排序算法的java代码实现如下:

/**

* 插入排序

*

* @param arr

*/

public static void insertionSort(int[] arr,int n) {

for (int i = 1; i < n; i++) {

int j = i;

while (j > 0 && arr[j] < arr[j - 1]) {

swap(arr,j,j-1);

j--;

}

}

}

直接插入的性能分析如下:

空间效率:仅使用常数个辅助单元,故而空间效率为O(1)。

时间效率:时间复杂度始终是O(n∧2).

稳定性:由于当i>j且A[i]=A[j]时,不会交换两个元素,从而直接插入排序是一个稳定的排序方法。

java学习总结篇二--3 种简单排序的更多相关文章

  1. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  2. 从.Net到Java学习第二篇——IDEA and start spring boot

    从.Net到Java学习第一篇——开篇 所谓工欲善其事,必先利其器,做java开发也一样,在比较了目前最流行的几个java IDE(eclipse,myeclipse.IDEA)之后,我果断选择IDE ...

  3. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

  4. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  5. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  6. 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口

    从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...

  7. java学习-zxing生成二维码矩阵的简单例子

    这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...

  8. salesforce零基础学习(七十九)简单排序浅谈 篇一

    我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的场景.篇一只是简单的描述一下选择排序,插 ...

  9. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

随机推荐

  1. 在ssm框架中前后台数据交互均使用json格式

    前后台数据交互均使用json. 框架ssm(spring+springmvc+mybatis) @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象,注解加 ...

  2. 30个CSS3选择器的应用

    或许大家平时总是在用的选择器都是: id class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选 或许大家平时总是在用的选择器都是:#id  .class ...

  3. java设计师初入职场,如何站稳脚跟

    本文内容一共由3部分展开 a:新人如何快速融入团队 b:如何在职场中提升自己影响力 c:如何规进行职业规划 a:如何快速融入团队   能在层层选拔下进入公司,说明你工作的能力还是得到公司的认可,不过这 ...

  4. HTML出现错位的问题

    引起网页HTML显示错位的几个常见问题: 1.在HTML代码中缺失元素的开始或结束标签 2.CSS设置中对边界.填充或边框的设置超出了父级容器的范围 3.CSS和HTML的编码不统一 4.浏览器的解析 ...

  5. 从事务角度粗窥架构的可扩展性和可维护性:内容整理自java web轻量级开发面试教程

    大家多少了解过架构,也听说过使用架构后,代码和可维护性和重用性能大大提升.这里我们来通过一些关于事务的实例,来感性地体会下架构带来的在可维护性方面的便利.本文来是从 java web轻量级开发面试教程 ...

  6. SpringMV---params and headers

      配置文件承接一二章    params params:请求的参数    params=value 表示请求过来的参数必须等于value    params!=value 表示请求过来的参数必须不等 ...

  7. Go基础篇【第5篇】: 内置库模块 exec

    Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and s ...

  8. java 之 简单工厂模式(大话设计模式)

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...

  9. Android Testing Point

    The test application demonstrates these key points: An Android test is itself an Android application ...

  10. 件测试博客日记Day03-11.17日 —— 赵天宇 —— 禅道的使用和配置详细版

    说在维基百科先查找关于禅道相关知识,发现有关于禅道这个项目管理软件的详细介绍,然后将相关的介绍进行整理写入文档,在禅道的介绍中也有下载地址并进行安装. (1)软件的基本情况 a.中文名称:禅道项目管理 ...