java 七大排序
一共有7种排序
1、冒泡排序
所以时间复杂度最好和最坏都是O(n^2),空间复杂度为O(1) 很稳定
但是加一个判断语句Swap之后:
时间复杂度最好O(n),最坏是O(n^2),避免了数组原来有序,导致许多无用功。空间复杂度为O(1) ,很稳定。
public class maopao {
private static void bubbleSort(int [] array){//定义int类型的数组
int tmp = 0;//定义中间变量
boolean swap = false;//定义swap判断是否近入到了循环,本来就是从小到大顺序,则不进入
for (int i = 0; i < array.length-1; i++) {//对数组进行遍历
for (int j = 0; j < array.length-1-i; j++) {//每次要减一个,所以要减i
if (array[j] > array [j+1]){//判断当前值与下一个值大小进行比较,成功 就交换两个数
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
swap = true;
}
}
if (!swap){//判断是否进入 true:没有进入 flase:不进入下面的break;
break;
}
}
}
下面是原理步骤图
2、直接插入排序
时间复杂度最好O(n) (本来是顺序结构) 最坏O(n^2) 空间复杂度:o(1); 稳定
public static void insertSort(int [] arrry){
int tmp = 0;//定义一个容器
int j = 0;//另j等于0最前面
for (int i = 1;i < arrry.length; i++) {//让i从一号下标开始
tmp = arrry[i];//把i中的值放进上面定义的容器中
for (j = i-1; j >= 0; j--) {//因为每一次j都是从i后面的那个元素开始比较
if (arrry[j] > tmp){//让j的值和tmp容器里的值进行比较;如果j的值大于容器里的值就进行下面操作
arrry [j+1]=arrry[j];//让j的值放进前面的那个空位置(i赋给了tmp,所以有一个空位置,或者之前比较剩下的)
}else {//否则就break退出掉进行下一个步骤
break;
}
}
arrry[j+1] = tmp;//发现后面的j值不大于tmp容器里的值就将tmp里的值放进j前面的那个空位置
}
}
3、shell排序
时间复杂度最好是O(n),最坏是O(n2),但是平均下来是O(n1.3) (专业统计的)
空间复杂度O(1) 不稳定
// shell排序自我感觉和直接插入排序一样,他只是一个有跳跃式的排序,让第一个和它的后面的数比较第二个数和后面加一的数比较等等
public static void shell(int[] array,int gap) {//从下面得函数中知道这个gap的值,也就是隔gap隔值进行插入排序
// 下面的这些和直接插入排序一模一样
int tmp = 0;
for (int i = gap; i < array.length; i++) {
tmp = array[i];
int j = 0;
for (j = i-gap; j >= 0; j -= gap) {//因为是隔gap个数,所以要减去gap的数
if(array[j] > tmp) {
array[j+gap] = array[j];
} else {
break;
}
}
array[j+gap] = tmp;
}
}
public static void shellSort(int[] array) {
int drr[] = {14,8,1};//这个里面定义的数字决定他们之间要隔多少个比较,但最后一个必须是 1
for (int i = 0; i < drr.length; i++) {//遍历这个数组,然后调用shell的函数
shell(array,drr[i]);
}
}
4、选择排序:
时间复杂度最好最坏都是:O(n^2) 空间复杂度:O(1) 不稳定
public static void SelectSort(int [] array){