1.冒泡排序
相邻两个节点从左至右两两比较,将大的移至最右端.
- 冒泡排序的效率
比较O(N的平方),交换O(N的平方)
- 代码示例
public class BubbleSort {
private int[] array = new int[10];
private int compareCount = 0;
private int swapCount = 0;
//比较,交换
public void swap(int x,int y){
System.out.println("array["+x+"]和array["+y+"]进行比较!!!");
++this.compareCount;
if(array[x] > array[y]){
System.out.println(" 进行交换!!!");
int temp = array[x];
array[x] = array[y];
array[y] = temp;
++this.swapCount;
}
}
//排序
public void bubbleSort(){
//外层循环控制最后一次比较左边元素位置
for(int out = this.array.length-2; out >= 0; out--){
System.out.println("==============");
//内层循环控制每次比较向右移动一次
for(int j = 0; j <= out; j++){
swap(j,j+1);
}
}
System.out.println("排序完成,共"+this.compareCount+"次比较,"+this.swapCount+"次交换!!!");
}
public static void main(String[] args) {
BubbleSort bs = new BubbleSort();
bs.array[0] = 20;
bs.array[1] = 46;
bs.array[2] = 19;
bs.array[3] = 11;
bs.array[4] = 13;
bs.array[5] = 9;
bs.array[6] = 8;
bs.array[7] = 67;
bs.array[8] = 25;
bs.array[9] = 2;
System.out.println(Arrays.toString(bs.array));
bs.bubbleSort();
System.out.println(Arrays.toString(bs.array));
}
}
输出:
[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
进行交换!!!
array[2]和array[3]进行比较!!!
进行交换!!!
array[3]和array[4]进行比较!!!
进行交换!!!
array[4]和array[5]进行比较!!!
进行交换!!!
array[5]和array[6]进行比较!!!
进行交换!!!
array[6]和array[7]进行比较!!!
array[7]和array[8]进行比较!!!
进行交换!!!
array[8]和array[9]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
进行交换!!!
array[1]和array[2]进行比较!!!
进行交换!!!
array[2]和array[3]进行比较!!!
进行交换!!!
array[3]和array[4]进行比较!!!
进行交换!!!
array[4]和array[5]进行比较!!!
进行交换!!!
array[5]和array[6]进行比较!!!
array[6]和array[7]进行比较!!!
进行交换!!!
array[7]和array[8]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
进行交换!!!
array[1]和array[2]进行比较!!!
进行交换!!!
array[2]和array[3]进行比较!!!
进行交换!!!
array[3]和array[4]进行比较!!!
进行交换!!!
array[4]和array[5]进行比较!!!
array[5]和array[6]进行比较!!!
array[6]和array[7]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
进行交换!!!
array[2]和array[3]进行比较!!!
进行交换!!!
array[3]和array[4]进行比较!!!
array[4]和array[5]进行比较!!!
array[5]和array[6]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
进行交换!!!
array[1]和array[2]进行比较!!!
进行交换!!!
array[2]和array[3]进行比较!!!
array[3]和array[4]进行比较!!!
array[4]和array[5]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
进行交换!!!
array[1]和array[2]进行比较!!!
array[2]和array[3]进行比较!!!
array[3]和array[4]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
array[2]和array[3]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
array[1]和array[2]进行比较!!!
进行交换!!!
==============
array[0]和array[1]进行比较!!!
进行交换!!!
排序完成,共45次比较,30次交换!!!
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]
2.选择排序
从左至有依次找出最小的,放置在最左边.
- 选择排序的效率
比较:O(N的平方),交换O(N)
- 代码示例
//将每次找到的最小值依次放在0,1,2...
public class SelectSort {
private int[] array = new int[10];
private int compareCount = 0; //比较次数
private int swapCount = 0; //交换次数
public void selectSort(){
int min;//最小值的下标
//第一层循环控制每次最小值放置的位置
for(int i=0; i<= this.array.length-2; i++){
System.out.println("============");
min = i;
//第二层循环控制每次比较左边值的移动
for(int j=i+1; j<=this.array.length-1;j++){
++this.compareCount;
System.out.println("array["+j+"]和array["+i+"]进行比较!!!");
if(this.array[j] < this.array[min]){
min = j;
}
}
if(min!=i){
swap(i,min);
System.out.println(" 进行交换!!!");
}
}
System.out.println("排序完成,共"+this.compareCount+"次比较,"+this.swapCount+"次交换!!!");
}
public void swap(int x,int y){
++this.swapCount;
int temp = this.array[x];
this.array[x] = this.array[y];
this.array[y] = temp;
}
public static void main(String[] args) {
SelectSort ss = new SelectSort();
ss.array[0] = 20;
ss.array[1] = 46;
ss.array[2] = 19;
ss.array[3] = 11;
ss.array[4] = 13;
ss.array[5] = 9;
ss.array[6] = 8;
ss.array[7] = 67;
ss.array[8] = 25;
ss.array[9] = 2;
System.out.println(Arrays.toString(ss.array));
ss.selectSort();
System.out.println(Arrays.toString(ss.array));
}
}
输出:
[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
============
array[1]和array[0]进行比较!!!
array[2]和array[0]进行比较!!!
array[3]和array[0]进行比较!!!
array[4]和array[0]进行比较!!!
array[5]和array[0]进行比较!!!
array[6]和array[0]进行比较!!!
array[7]和array[0]进行比较!!!
array[8]和array[0]进行比较!!!
array[9]和array[0]进行比较!!!
进行交换!!!
============
array[2]和array[1]进行比较!!!
array[3]和array[1]进行比较!!!
array[4]和array[1]进行比较!!!
array[5]和array[1]进行比较!!!
array[6]和array[1]进行比较!!!
array[7]和array[1]进行比较!!!
array[8]和array[1]进行比较!!!
array[9]和array[1]进行比较!!!
进行交换!!!
============
array[3]和array[2]进行比较!!!
array[4]和array[2]进行比较!!!
array[5]和array[2]进行比较!!!
array[6]和array[2]进行比较!!!
array[7]和array[2]进行比较!!!
array[8]和array[2]进行比较!!!
array[9]和array[2]进行比较!!!
进行交换!!!
============
array[4]和array[3]进行比较!!!
array[5]和array[3]进行比较!!!
array[6]和array[3]进行比较!!!
array[7]和array[3]进行比较!!!
array[8]和array[3]进行比较!!!
array[9]和array[3]进行比较!!!
============
array[5]和array[4]进行比较!!!
array[6]和array[4]进行比较!!!
array[7]和array[4]进行比较!!!
array[8]和array[4]进行比较!!!
array[9]和array[4]进行比较!!!
============
array[6]和array[5]进行比较!!!
array[7]和array[5]进行比较!!!
array[8]和array[5]进行比较!!!
array[9]和array[5]进行比较!!!
============
array[7]和array[6]进行比较!!!
array[8]和array[6]进行比较!!!
array[9]和array[6]进行比较!!!
进行交换!!!
============
array[8]和array[7]进行比较!!!
array[9]和array[7]进行比较!!!
进行交换!!!
============
array[9]和array[8]进行比较!!!
进行交换!!!
排序完成,共45次比较,6次交换!!!
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]
3.插入排序
从左至右,依次将右边的节点拿到左边排序好,让左边形成局部排好序的状态.
- 插入排序的效率
仍需要O(N)的时间,但一般比冒泡排序和选择排序更快.
- 代码示例
public class InsertSort {
private int[] array = new int[10];
private static int moveCount = 0;
private static int compareCount = 0;
//插入排序
public void insertSort(){
for(int out = 1;out <= array.length-1;out++){
int temp = array[out];
int in = out;
while(in >=1 && array[in-1] >= temp){
++compareCount;
array[in] = array[in-1];
++moveCount;
--in;
}
array[in] = temp;
++moveCount;
}
}
public static void main(String[] args) {
InsertSort is = new InsertSort();
is.array[0] = 20;
is.array[1] = 46;
is.array[2] = 19;
is.array[3] = 11;
is.array[4] = 13;
is.array[5] = 9;
is.array[6] = 8;
is.array[7] = 67;
is.array[8] = 25;
is.array[9] = 2;
System.out.println(Arrays.toString(is.array));
is.insertSort();
System.out.println(Arrays.toString(is.array));
System.out.println("moveCount="+moveCount+",compareCount="+compareCount);
}
}
输出:
[20, 46, 19, 11, 13, 9, 8, 67, 25, 2]
[2, 8, 9, 11, 13, 19, 20, 25, 46, 67]
moveCount=39,compareCount=30
4.字符串比较
字符串比较采用String.compareTo()方法.
- 代码示例
public static void main(String[] args) {
String a = "aaa";
String b = "bbb";
System.out.println(a.compareTo(b));
System.out.println(a.compareTo(a));
System.out.println(b.compareTo(a));
}
输出:
-1
0
1