1选择排序
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
// 选择排序
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
{
int idx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[idx]) {
idx = j;
}
}
if (i != idx) {
int tmp = arr[i];
arr[i] = arr[idx];
arr[idx] = tmp;
}
}
}
}
2.堆排序
//堆排序注意:
//仅用于排序话,没有必要建立MaxHeap的类,借用其思想即可,没必要建立哨兵在index=0处
rootIndex的左子节点为2*rootdex+1,右子节点2*rootdex+2,因为最顶上的根节点index=0
//arr.length就是节点长度
//而lastIndex=arr。length-1
public static void main(String[] args) {
int []arr=new int[]{1,2,5,4,6,7,12,10}; //lastIndex=8-1=7
heapSort(arr);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
public static void heapSort(int[] arr) {
for (int i=( arr.length/2-1);i>=0; i--) {
reheap(arr,i,arr.length-1);
}
int tmp=arr[arr.length-1]; //交换,把最大的12放到最后
arr[arr.length-1]=arr[0];
arr[0]=tmp;
for (int j=( arr.length-2);j>0; j--) { //在剩余的数据中重复上面过程,最大的往后放
reheap(arr,0,j);
tmp=arr[j];
arr[j]=arr[0];
arr[0]=tmp;
}
}
public static void reheap(int[] arr,int rootIndex,int lastIndex)
{boolean done=false;
int orphan=arr[rootIndex];
int largeChild=rootIndex*2+1;
int leftChild=0;
int rightChild=0;
while (!done&&largeChild<=lastIndex) {
leftChild=largeChild;
rightChild=leftChild+1;
if(rightChild<lastIndex&&arr[rightChild]>arr[largeChild]){ //arr.length-1就是lastIndex
largeChild=rightChild;
}
if(orphan<arr[largeChild])
{
arr[rootIndex]=arr[largeChild];
rootIndex=largeChild;
largeChild=rootIndex*2+1;
}
else
done=true;
}
arr[rootIndex]=orphan;
for(int m=0;m<arr.length;m++){
System.out.print(arr[m]+",");
}
System.out.println("");
}
显示:
1,2,5,10,6,7,12,4,
1,2,12,10,6,7,5,4,
1,10,12,4,6,7,5,2,
12,10,7,4,6,1,5,2, //第一次重建堆
10,6,7,4,2,1,5,12, //取12放到最后
7,6,5,4,2,1,10,12, //取10放到最后
6,4,5,1,2,7,10,12,
5,4,2,1,6,7,10,12,
4,1,2,5,6,7,10,12,
2,1,4,5,6,7,10,12,
1
2
4
5
6
7
10
12