选择排序
直接选择排序
每一次从无序区间内选出最小(或最大)的元素放在无序区间的最前(或最后),直到待排序数组全部排完。
public static void selectSort(int[] array){
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;
}
}
}
}
运行结果:
性能分析:
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
- 稳定性:不稳定
堆排序
排升序建大堆,排降序建小堆
//向下调整
public static void adjust(int[] array, int parent, int size){
int child = 2*parent+1;
while (child < size){
if (child+1 < size && array[child] < array[child+1]){
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 static void creatHeap(int[] array){
//p是每棵子树的根节点
for (int p = (array.length-1-1)/2; p >= 0 ; p--) {
adjust(array,p,array.length);
}
}
//将堆顶元素和尾进行交换
public static void heapSort(int[] array){
creatHeap(array);
int end = array.length-1;
while (end > 0){
int tmp = array[0];
array[0] = array[end];
array[end] = tmp;
adjust(array,0,end);
end--;
}
}
运行结果:
性能分析:
- 时间复杂度:O(n*logn)
- 空间复杂度:O(1)
- 稳定性:不稳定
比较两个排序的时间复杂度
-
直接选择排序:
-
堆排序: