Java基礎總結 - 數組排序之選擇排序

Java基礎總結 - 數組排序之選擇排序
這篇文章只是把大學記的筆記整理到博客,方便自己查看,不保證權威性(•̀ᴗ•́)و ̑̑
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;
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章