1、直接选择排序
按升序排序,假设下标为0的数为最大值(max=0),用指针j从下标为0处开始遍历,找到比array[max]的值大的时候,max就为较大数的下标值,并把这个值与最后一个值交换,共有几个数,按此规律循环几次,循环过程中,无序数组的范围是:[0,array.length-i],有序数组为[array.length-i,array.length],代码如下:
`
for(int i=0;i<array.length;i++){
int max=0;
for(int j=0;j<array.length-i;j++){
if(array[j]>array[max]){
max=j;
}
}
int t=array[max];
array[max]=array[array.length-1-i];
array[array.length-1-i]=t;
}
`
2、堆排序(以建大堆为例)
大堆性质:父结点的值大于子节点的值
父结点下标若为i,那么他的左孩子结点下标为:2i+1;右孩子结点下标为:2i+2;
子节点下标若为j,那么他的父结点下标为:(j-1)/ 2;
先将一组数建成完全二叉树,然后利用向下调整的方式建成大顶堆,因为是大顶堆,所以下标为0的地方是无序部分的最大值,将无序部分的第一个数和最后一个数交换位置,此时无序部分的最后一个数就有序部分的第一个数,再将交换后的第一个数进行向下调成变成新的大顶堆,以此循环
建大堆向下调整:
public static void adjustdown(int[] array,int size,int index){
int max=2*index+1;
while (max<size){
while (max+1<size&&array[max+1]>array[max]){
max=max+1;
}
if(array[index]>array[max]){
break;
}
int t=array[max];
array[max]=array[index];
array[index]=t;
index=max;
max=2*index+1;
}
堆排序:
public static void heapSort(int[] array){
for(int i=(array.length-1-1)/2;i>=0;i--){
adjustdown(array,array.length,i);