选择排序
(一)选择排序
每一次从无序区间选出一个最小(大)的值放在最后(前),直到所有数排完。
public static void selectSort(int[]array){
for (int i = 0; i < array.length-1; i++) {
int max=0;
for (int j = 0; j < array.length-i; j++) {
if(array[j]>array[max])
max=j;
}
int tmp=array[max];
array[max]=array[array.length-i-1];
array[array.length-i-1]=tmp;
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:不稳定
(二)堆排序
堆排序是利用对这种数据结构设计出来的排序算法,升序采用大堆,降序采用小堆。
/**
* 堆排序
* 时间复杂度:O(n*log(n))
* 空间复杂度:O(1)
* 稳定性:不稳定
* @param array
* @param parent
* @param size
*/
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--;
}
}