import java.util.Arrays;
/**
* 直接選擇排序
* 第一次循環記錄下最小那個數字的下標,和array[0]交換,
* 第二次記錄第二個數開始最大的數下標和array[1]交換。以此類推。
*
* @author CL-computer
*
*/
public class SelectSort {
public static void main(String[] args) {
int[] nums = {1,5,7,1,6,9,8,5};
SelectSortMetohd(nums);
System.out.println(Arrays.toString(nums));
}
public static void SelectSortMetohd(int[] nums){
for(int i = 0;i<nums.length;i++){
int index = i;
for(int j = i;j<nums.length;j++){
index = nums[index]<nums[j]?index:j;
}
int temp = 0;
temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
}
}
}
import java.util.ArrayList;
import java.util.List;
/**
* 堆排序
* 建立一個最小二叉堆,其中父節點小於其兩個子節點。每次輸出根節點。
* 這裏的難點是移除根節點後的算法。
* 這裏有兩個過程,在堆還是亂序的情況下我們得用一個算法來建堆。 得從尾部從新下沉,直到跟節點使得整顆樹有序
* 建堆建好以後得用,每次輸出頭之後。只需從頭部向下找合適的位置
*
* 建堆buildHeap 和 取出數據heapSortMetohd 都通過一個heapFixdown重新排序,
* 當我們建堆操作時,從底部一小層一小層往上建,最終形成一個完整有序的堆
* 只是當我們取出頂部元素後 將最末節點替代它需要進行一次下沉。
*
* @author CL-computer
*
*/
public class HeapSort {
public static void main(String[] args) {
int[] nums = {1,5,7,1,6,9,8,5};
List<Integer> list= heapSortMetohd(nums);
System.out.println(list);
}
public static List<Integer> heapSortMetohd(int[] nums) {
buildHeap(nums);
List<Integer> list= new ArrayList<>();
for(int i= nums.length-1;i>=0;i-- ){
list.add(nums[0]);
nums[0] = nums[i];
heapFixdown(nums, 0, i);
}
return list;
}
public static void buildHeap(int[] nums) {
for(int i =(nums.length-1)/2;i>0;i--){
heapFixdown(nums,i,nums.length);
}
}
public static void heapFixdown(int[] nums, int i, int length) {
int temp = nums[i];
int y = i*2+1;
while(y<length){
if(y+1<length && nums[y]>nums[y+1]){
y++;
}
if(nums[y]>temp){
break;
}
nums[i] = nums[y];
i=y;
y=y*2+1;
}
nums[i]=temp;
}
}