java学习总结篇二--3 种简单排序
本篇文章,先从数据结构开始,一边总结,一边反思,寻求最优解。
本文简单温习下最基础的三类算法:选择,冒泡,插入。先定义一个交换数组作为备用:
/**
* 交换数组元素
* @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 种简单排序的更多相关文章
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 从.Net到Java学习第二篇——IDEA and start spring boot
从.Net到Java学习第一篇——开篇 所谓工欲善其事,必先利其器,做java开发也一样,在比较了目前最流行的几个java IDE(eclipse,myeclipse.IDEA)之后,我果断选择IDE ...
- Java学习-028-JSON 之二 -- 数据读取
JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...
- 从.Net到Java学习第一篇——开篇
以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...
- MongoDB学习:(二)MongoDB简单使用
MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...
- 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口
从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...
- salesforce零基础学习(七十九)简单排序浅谈 篇一
我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的场景.篇一只是简单的描述一下选择排序,插 ...
- Java学习笔记(二一)——Java 泛型
[前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...
随机推荐
- keepalived中的脑裂
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体.动作协调的HA系统,就分裂成为2个独立的个体.由于相互失去了联系,都以为是对方出了故障.两个节点上的HA软件像“裂脑人”一样,争 ...
- jQuery_DOM学习之------遍历节点
一.children()方法 例子: <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...
- 学习C++ -> 构造函数与析构函数
学习C++ -> 构造函数与析构函数 一.构造函数的介绍 1. 构造函数的作用 构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用 ...
- 第一章 Linux系统介绍与环境搭建准备
1.操作系统: Operating System,简称OS,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统就是处于用户与计算机系统硬件之间用于传递信息的系统程序软件. ...
- Layui框架+PHP打造个人简易版网盘系统
网盘系统 大家应该都会注册过致命的一些网盘~如百度云.百科介绍:网盘,又称网络U盘.网络硬盘,是由互联网公司推出的在线存储服务,服务器机房为用户划分一定的磁盘空间,为用户免费或收费提供文件的存储. ...
- js贪吃蛇-简单版
分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- php 常用 常量集合
DIRECTORY_SEPARATOR 常量 DIRECTORY_SEPARATOR 目录分割符
- c#正则表达式应用实例
两种使用方法: 1.在文本输入框后加入正则表达式验证控件Regularexpression_r_rValidator.此种方法适用于WebForm中.在Validationexpression_r_r ...
- 【python】Python的单例模式
原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...