1.冒泡排序:
1.算法描述:
1. 首先在未排序数组的首位开始,和后面相邻的数字进行比较,如果前面一个比后面一个大那么则进行交换。
2.接下来将第二个位置的数字和后面相邻的数字进行比较,如果大那么则进行交换,直到将最大的数字交换的数组的尾部。
3.然后再从排序的数组的首位开始,重复前面两部将最大的数字交换到未排序数组的尾部如此反复,直到排序完毕。
(交换到尾部的数字是已经拍好序的)。
package simple;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arrs={8,6,1,2,2,5,4,12,9};
bubbleSort(arrs);
System.out.println(Arrays.toString(arrs));
}
public static void bubbleSort(int[] arrs){
int num=0;
// for (int i = arrs.length-1; i >=0; i--) {
for (int i = 1; i <arrs.length; i++) {
// for (int j = 0; j < i; j++) {
for (int j = 0; j < arrs.length-i; j++) {
if (arrs[j]>arrs[j+1]){
num=arrs[j];
arrs[j]=arrs[j+1];
arrs[j+1]=num;
}
}
}
}
}
2.选择排序:
1.算法描述:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
package simple;
import java.util.Arrays;
public class SelectionSort {
public static void main(String[] args) {
int[] arrs={8,8,1,7,2,5,4,12,9};
selectionSort(arrs);
System.out.println(Arrays.toString(arrs));
}
public static void selectionSort(int[] arrs){
int middle;
for (int i = 0; i < arrs.length; i++) {
// 最小值的索引
int index=i;
for (int j = i+1; j < arrs.length; j++) {
if(arrs[index]>arrs[j]){
index=j;
}
middle=arrs[i];
arrs[i]=arrs[index];
arrs[index]=middle;
}
}
}
}
3.插入排序:
1.算法描述:
1从第一个元素开始,该元素可以认为已经被排序;
2取出下一个元素,在已经排序的元素序列中从后向前扫描;
3如果该元素(已排序)大于新元素,将该元素移到下一位置;
4重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5将新元素插入到该位置后;
6重复步骤2~5。
package simple;
import java.util.Arrays;
public class InsertionSort {
public static void main(String[] args) {
int[] arrs={8,6,1,2,2,5,4,12,9};
insertionSort(arrs);
System.out.println(Arrays.toString(arrs));
}
public static void insertionSort(int[] arrs){
for (int i = 1; i < arrs.length; i++) {
int num=arrs[i];
for (int j = i-1; j >=0 ; j--) {
if (arrs[j]>=num){
arrs[j+1]=arrs[j];
}else {
arrs[j+1]=num;
break;
}
if (j==0){
arrs[0]=num;
}
}
}
}
}
4 三种算法的比较
上面讲的三种排序,冒泡、选择、插入由于均使用的了嵌套循环,并且循环基本上都要遍
历所有的元素,所以用大 O 表示法都需要 O(N^2) 时间级别。
但是三种排序还是有一些细微的区别(循环比较次数、交换次数)
冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的。因为它的循环比较次数和交换次数都比较多
选择排序循环比较的次数多,但是交换的次数少
插入排序的交换次数多,但是循环比较的次数少