public class 选择排序 {
public static void swap(int[] array, int i, int j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
/**
* 选择排序:
*时间复杂度:O(n^2)
* 空间复杂度:O(1)
* 稳定性:不稳定
* @param array
*/
public static void selectSort(int[] array){
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i+1; j < array.length; j++) {
if(array[minIndex] > array[j]){
minIndex = j;
}
}
if(minIndex != i){
int tmp = array[i];
array[i] = array[minIndex];
array[minIndex] = tmp;
}
}
}
/**
* 堆排序:
* 时间复杂度:O(N * log N)
*
* 空间复杂度:O(1)
*
* 稳定性:不稳定
*
* 面试 写堆排序 就是 写的调整过程
*
* @param array
*/
public static void heapSort(int[] array){
createHeap(array);
for (int i = array.length-1; i > 0; i--) {
swap(array,0,i);
shiftDown(array,0,i);
}
}
public static void createHeap(int[] array){
for(int parent = (array.length-1-1)/2; parent >= 0; parent--){
shiftDown(array,parent,array.length);
}
}
public static void shiftDown(int[] array, int parent, int len){
int child = parent*2 + 1;
//1.判断有左孩子
while (child < len){
//2.判断有右孩子
if(child+1 < len && array[child+1] > array[child]){
//3.右孩子大 child指向右孩子
child++;
}
//4.孩子大于父亲 交换
if(array[parent] < array[child]){
swap(array,parent,child);
//5.继续向下调整
parent = child;
child = parent*2 + 1;
}else{
//不交换 直接跳出
break;
}
}
}
Java常见排序算法之选择排序
最新推荐文章于 2024-05-06 10:37:06 发布