1.冒泡排序
在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,
持续这个过程,直到数组整体有序。
代码示例:
//1.时间复杂度:O(N^2) 不分好坏
//2.空间复杂度:O(1)
//3.稳定性:不稳定 有跳跃式交换
public static void selectSort(int[] array){
//i为趟数,J为比较的次数
for (int i = 0; i <array.length ; i++) {
for (int j = i+1; j <array.length ; j++) {
if(array[i]>array[j]){
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
}
}
}
2.堆排序
基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。
注意: 排升序要建大堆;排降序要建小堆。
代码示例:
public void adjustDown(int []array,int root, int len){
int parent=root;
int child=2*parent+1;
//最起码有左子树
while(child<len){
//1.child+1<len证明有右孩子的,,找到左右孩子的最大值
if(child+1<len &&array[child]<array[child+1]){
child++;
}
//child保存的是左右孩子最大值的下标
if(array[child]>array[parent]){
int tmp=array[child];
array[child]=array[parent];
array[parent]=tmp;
parent=child;//还要指向孩子节点,因为无法确定是否子树 调整完毕
child=2*parent+1;
}else{
//不需要进行调整了
break;
}
}
}
public void createHeap(int []array){
for (int i = (array.length-1-1)/2; i >=0 ; i--) {
adjustDown(array,i,array.length);
}
}
//堆排序
//1.时间复杂度:O(nlogn)
//2.空间复杂度:O(1)
//3.稳定性:不稳定
public void heapSort(int []array){
//1.排升序创建大根堆
createHeap(array);
//2.堆顶元素和最后一个元素进行交换
int end=array.length-1;
while(end>0){
int tmp=array[0];
array[0]=array[end];
array[end]=tmp;
adjustDown(array,0,end);
end--;
}
}