1.直接选择排序
- 排序原理
- 每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完
public class SelectSort {
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[j] < array[i]){
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
}
}
public static void main(String[] args) {
int[] array = {27,15,19,18,28,34,65,49,25,37};
System.out.println(Arrays.toString(array));
selectSort(array);
System.out.println("===================直接选择排序==================");
System.out.println(Arrays.toString(array));
}
}
2.堆排序
- 排序原理:
- 基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。
- 注意: 排升序要建大堆;排降序要建小堆

public class HeapSort {
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;
adjustDown(array,0,end);
end--;
}
}
public static void adjustDown(int[] array,int parent,int len){
int child = 2*parent+1;
while (child < len){
if (child+1<len && 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){
for (int i = (array.length-1-1)/2; i >= 0; i--) {
adjustDown(array,i,array.length);
}
}
public static void main(String[] args) {
int[] array = {27,15,19,18,28,34,65,49,25,37};
System.out.println(Arrays.toString(array));
heapSort(array);
System.out.println("===================堆排序==================");
System.out.println(Arrays.toString(array));
}
}
- 稳定性:不稳定
- 时间复杂度:O(n * log(n))
- 空间复杂度:O(1)