堆排序:
public class Test02Sort {
//堆排序
//把数组建成一个大堆,把堆顶元素和堆最后一个元素互换,把最后一个元素删除,再从堆顶向下调整
public static void heapSort(int[] array){
//先建立堆
creatHeap(array);
//循环把堆顶元素交换到最后,并进行调整
for (int i=0;i< array.length-1;i++){
//length-1,当堆中只剩下一个元素的时候,也就一定是有序的
//交换堆顶元素和堆最后一个元素
swap(array,0,array.length-1-i);
//堆最后一个元素下标array.length-1-i
shiftDown(array,array.length-1-i,0);
}
}
private static void creatHeap(int[] array){
//从最后一个非叶子节点出发向前循环
for (int i=(array.length-1-1)/2;i>=0;i--){
shiftDown(array,array.length,i);
}
}
private static void shiftDown(int[] array,int heaplength,int index){
//大堆,升序
int parent=index;
int child=2*parent+1;
while (child<heaplength){
if(child+1<heaplength&&array[child+1]>array[child]){
child=child+1;
//条件结束,child已经是最有子树比较大的值得下标
if(array[child]>array[parent]){
swap(array,child,parent);
}else {
break;
}
parent=child;
child=2*parent+1;
}
}
}
private 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)
public static void selectSort(int[] array){
for (int bound=0;bound<array.length;bound++){
//以bound位置的元素作为擂主
//循环从待排序区间中取出元素和擂主进行比较
for (int cur=bound+1;cur< array.length;cur++){
if(array[cur]<array[bound]){
//打擂成功
int tmp=array[cur];
array[cur]=array[bound];
array[bound]=tmp;
}
}
}
}