一、冒泡排序
1.比较相邻的元素,如果前一个元素大于后一个元素就交换它们二个
2.第一遍比较完之后,最大的元素就在最后一个
3.下一次比较就少比较一次
4.持续每次对越来越少的元素重复上面的步骤,直到排序完成。
5.时间复杂度:O(n2)
稳定性:稳定
private static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean swap=false;//优化
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
swap=true;
}
}
if(!swap){
break;
}
}
}
二、插入排序
1.从第一个元素开始,该元素可以认为已经排好序。
2.取出下一个元素,然后把这个新元素在i经排好序的元素序列中从后往前扫描进行比较。
3.如果该元素(已排序)大于新元素,则将这个元素小于或者等于元素的位置。
4.重复步骤3,查到找到一排序的元素小于或者等于新元素的位置。
5.将新元素插入到该一排序的元素的索引位置后面。
6.重复步骤2—5。
7.稳定性:稳定
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int val = arr[i];
//在i前面已经排序好的序列中,找i元素插入的合适的位置
int j = i - 1;
//优化成二分查找合适的插入位置,不再使用线性查找
//0 j 找第一个小于val的值
for (; j >= 0; j--) {
if (val < arr[j]) {
arr[j + 1] = arr[j];
} else {
//把val元素插入到当前位置,然后循环结束
break;
}
}
arr[j + 1] = val;
}
}
}
三、选择排序
给一个定数组,第一次做循环判断时只需要保证你数组的第一数是最小的,即:将第一个数和第二个数比较,如果第二个数比第一个数小,就将两个数交换,然后再比较第一个数和第三个数,若第三个数还小,就继续交换,总之,把小的往前丢。
时间复杂度:O(n^2) 空间复杂度O(1)
稳定性:不稳定
public static void choiceSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = arr[i];
int k = i;
for (int j = i+1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];
k = j;
}
}
if (k!=i){
int tmp=arr[i];
arr[i]=arr[k];
arr[k]=tmp;
}
}
}
这些排序的效率:插入>选择>冒泡