選擇排序
1、直接選擇排序
2、堆排序
1、直接選擇排序
package sort;
//選擇排序
public class SelectSort {
public static void sortA(int[] arr,int n){
int tmp;//臨時變量
int min;//記錄最小值的下標
int compare=0;//比較次數
int change=0;//移動位置次數
for(int i=0;i<n-1;i++){
min=i;//默認當前i爲最小
for(int j=i+1;j<n;j++){//記錄最小的值的下標,然後放在第一個位置
compare++;//比較次數
if(arr[j]<arr[min]){
min=j;
}
}
//判斷min的值是否改變,如果改變了,則進行交換位置
if(min!=i){//min=j
change++;
tmp=arr[i];
arr[i]=arr[min];
arr[min]=tmp;
}
}
System.out.println("比較次數:"+compare);
System.out.println("移動位置次數:"+change);
}
public static void main(String[] args) {
int arr[]={4,5,6,3,1,9,0,8,7,2};
sortA(arr,arr.length);
System.out.println("排序後:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
2、堆排序
package sort;
//1.初始化大根堆
//2.將最大的數放在最後一個位置n-i處,重複多次操作即可完成
public class MyHeapSort {
//調整堆排序(僅是調整過程,建立在大頂堆已構建的基礎上)
public static void adjustHeap(int[] array,int i,int len){
int k=2*i;//左子節點
int temp;//臨時變量
while(k<len){
temp=array[i];//臨時變量存放父結點的值
//k 左子結點
//k+1 右子節點
//判斷左右子節點誰大,記錄誰
if(k+1<len && array[k]<array[k+1]){
k++;//記錄右子結點
}
//兒子結點 > 父親結點
if(array[k]>temp){
array[i]=array[k];//父親結點 記錄最大值
i=k;
}
else
break;//篩選結束【退出while循環】
k=2*i;//下一個左子結點
//將temp值放到最終的位置
array[i]=temp;//子結點,記錄父親節點的較小值【相當於array[i] 與 array[k] 的值進行了交換】
}
}
//堆排序
public static void heapSort(int[] array){
int len=array.length;//數組長度
//1.構造初始化堆
for(int i=len/2;i>=0;i--){
//從第一個非葉子結點從下至上,從右至左調整結構
adjustHeap(array,i,len);//調整堆
}
//2.重新進行堆排序[使得堆有序]
int temp;
for(int i=len-1;i>0;i--){//i=0處有放元素
//先調整元素
swap(array,0,i);//將堆頂元素與末尾元素進行交換【使得末尾元素最大,因爲交換前,堆頂元素最大】
//重新調整堆
adjustHeap(array,0,i);
}
}
/**
* 交換元素
*/
public static void swap(int []arr,int a ,int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String[] args) {
// int array[] = { 21, 50, 20, 40, 70, 19, 80, 30, 60,99 };
int array[] = {11,7,18,3,5,4,10,9,88,77};
System.out.println("排序之前:");
for (int element : array) {
System.out.print(element + " ");
}
heapSort(array);
System.out.println("\n排序之後:");
for (int element : array) {
System.out.print(element + " ");
}
}
}