Java学习笔记——排序算法之O(n²)排序

男儿何不带吴钩,收取关山五十州。请君暂上凌烟阁,若个书生万户侯?

                              ——南园十三首

三种排序法:

1、冒泡法

2、简单选择法

3、直接插入法

上代码:

1、冒泡排序

 1 public class BubbleSort {
 2
 3     //最简单的排序,从0开始逐个对比往上冒
 4     public static void bubbleSort(int[] arr) {
 5         for (int i = 0; i < arr.length-1; i++) {
 6             for (int j = i+1; j < arr.length; j++) {
 7                 if (arr[i]>arr[j]) {
 8                     arr[i] = arr[i]^arr[j];
 9                     arr[j] = arr[i]^arr[j];
10                     arr[i] = arr[i]^arr[j];
11                 }
12             }
13         }
14     }
15     //正宗冒泡,正向
16     public static void bubbleSortA(int[] arr) {
17         for (int i = 0; i < arr.length-1; i++) {
18             for (int j = 0; j < arr.length-i-1; j++) {
19                 if (arr[j]>arr[j+1]) {
20                     arr[j] = arr[j]^arr[j+1];
21                     arr[j+1] = arr[j]^arr[j+1];
22                     arr[j] = arr[j]^arr[j+1];
23                 }
24             }
25         }
26     }
27     //反向
28     public static void bubbleSortB(int[] arr) {
29         for (int i = 0; i < arr.length-1; i++) {
30             for (int j = arr.length-1; j > i; j--) {
31                 if (arr[j-1]>arr[j]) {
32                     arr[j] = arr[j]^arr[j-1];
33                     arr[j-1] = arr[j]^arr[j-1];
34                     arr[j] = arr[j]^arr[j-1];
35                 }
36             }
37         }
38     }
39     //优化冒泡
40     public static void bubbleSortA0(int[] arr) {
41         boolean flag = true;
42         for (int i = 0; i < arr.length-1 && flag; i++) {
43             flag = false;
44             for (int j = arr.length-1; j > i; j--) {
45                 if (arr[j-1]>arr[j]) {
46                     arr[j] = arr[j]^arr[j-1];
47                     arr[j-1] = arr[j]^arr[j-1];
48                     arr[j] = arr[j]^arr[j-1];
49                     flag = true;//若没有发生交换,说明每对的前一位都不比后一位更大。无需再次排序
50                 }
51             }
52         }
53     }
54 }

2、简单选择排序,跟冒泡第一个思路差不多。区别在于不是每次都交换,而是记录最值的下标位置,每趟的最后交换

 1 public class SimpleSelectSort {
 2
 3     //简单冒泡的升级版,内外层循环不变,赋值n次,交换一次
 4     public static void simpleSelectSort(int[] arr){
 5         int min;
 6         for (int i = 0; i < arr.length-1; i++) {
 7             min = i;
 8             for (int j = i+1; j < arr.length; j++) {
 9                 if (arr[min] > arr[j]) {
10                     min = j;
11                 }
12             }
13             if (min != i) {
14                 arr[min] = arr[min] ^ arr[i];
15                 arr[i] = arr[min] ^ arr[i];
16                 arr[min] = arr[min] ^ arr[i];
17             }
18         }
19     }
20 }

3、直接插入法,这个思路就很好了,类似于捋牌。

 1 public class StraightInsertionSort {
 2
 3     //该方法从第二位开始取出,如果比前面小插入,前面的后移,想象理牌5,3,4,6,2,同花顺
 4     public static void straightinsertionsort(int[] arr){
 5         int temp;
 6         for (int i = 1,j = 0; i < arr.length; i++) {
 7             if (arr[i]<arr[i-1]) {
 8                 temp = arr[i];//取出牌
 9                 j = i-1;//给内层循环赋初值
10                 while (j>=0 && arr[j] > temp) {
11                     arr[j+1] = arr[j];//比牌大的后移
12                     j--;
13                 }
14                 arr[j+1] = temp;//插入牌
15             }
16         }
17     }
18 }
时间: 2024-08-28 22:32:41

Java学习笔记——排序算法之O(n²)排序的相关文章

非专业码农 JAVA学习笔记 6java工具类和算法-string

续<非专业码农 JAVA学习笔记 5 java工具类和算法> 五.字符串string 字符串和字符的差别:字符串双引号括起来”n”,字符用单引号括起来,表示一种符号’\n’ 1.string的主要方法和属性 类 方法或者属性 备注 定义string Stirng s=new string(“值”),string s=”值” 属性 string.length:string的长度为字节 方法startswith,endswith s.startwith(“值”)-以值为开头,s.endswith(

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

java学习笔记13--比较器(Comparable、Comparator)

java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序. Comparable接口 可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口. Comparable接口的定义如下: public  int

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

java学习笔记一

只记录一些我认为比较必要,容易出错的地方.(不断更新中) 内存:分为四段,代码段code segment,数据段data segment,栈stack, 堆heap.记住如下图 数据类型: 1.java整形常量默认为int类型,当使用long类型时,因此需要添加“l”或“L”,一般用大写,小写像1.如long i = 888888888888L 2.浮点数时会默认为double类型,因此使用float时需要添加f.如 float i = 0.123f 3.java支持大数运算. 强制转换 flo

Java 学习笔记(2015.7.20~24)

Java 学习笔记(2015.7.20~24) Java Java 学习笔记(2015.7.20~24) 1.StringBuffer与StringBuilder的区别: 2.基本数据类型包装类 3.Date.Calendar.DateFormat等与时间相关的类 1.常用类String 2.正则表达式 3.常用类 StringBuffer 代表可变的字符序列 拆箱与装箱 包装类的应用 匿名内部类 数组 day11 day12 day13 day14 day11 父类中使用public定义的方法

JAVA学习笔记 -- 数据结构

一.数据结构的接口 在Java中所有类的鼻祖是Object类,但是所有有关数据结构处理的鼻祖就是Collection和Iterator接口,也就是集合与遍历. 1.Collection接口 Collection c = new Xx(); // c可以称为Collection接口回调对象,虽然它被声明为Collection类型,但是实例化时实现的是接口的实现类Xx.它的方法也是用来操作实现类的对象. <span style="white-space:pre"> </s

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

Java学习笔记(2015.7.27~7.31)

Java学习笔记(2015.7.27~7.31) Java 课堂 Java学习笔记(2015.7.27~7.31) 小技巧 常用方法 1.List另一个子类--LinkedList 2.数组的常用方法 3.排序 1.二分法查找 2.数组转换为List 3.可变参数Type ... param (了解) 1.容器Collection 2.自动拆装箱(了解) 3.JDK增强for循环(了解) 4.泛型(掌握) 5.iterator与for在迭代中的区别 1.概念:保存多个对象的对象. 2.JDk为什

Java学习笔记_24_Map接口

24.Map接口: Map接口定义了存储"键(key)-值(value)映射对"的方法,Map中不能有重复的"键", Map实现类中储存的"键-值"映射对是通过键来唯一标识的,Map底层的"键"使用Set来存放的, 所以Map中的映射对的"键"对应的类必须重写hashCode()和equals()方法, 常用String作为Map的"键".  Map的添加.删除操作: · Object