1. 程式人生 > 其它 >105. 從前序與中序遍歷序列構造二叉樹(java實現)--LeetCode

105. 從前序與中序遍歷序列構造二叉樹(java實現)--LeetCode

技術標籤:Java資料結構Java資料結構選擇排序排序演算法java

一、選擇排序演算法基思想

從陣列中選擇最小元素,將它與陣列的第一個元素交換位置。再從陣列剩下的元素中選擇出最小的元素,將它與陣列的第二個元素交換位置。不斷進行這樣的操作,直到將整個陣列排序,即陣列長度為n需要需要進行n-1次選擇排序才可以完成從小到大的排序,一般選擇排序的平均時間複雜度為O(n^2)。

二、選擇排序圖解

黃色表示已排序部分,藍色表示未排序部分,紅色表示從未排序中選擇的最小值。

在這裡插入圖片描述
三、程式碼實現

package Sort;

import java.util.Arrays;

public class SelectSort
{ public static void selectsort(int[] arr) { for(int i=0;i<arr.length-1;i++) {// //最後一個元素沒有必要給它排序,即資料有n個只需要進行n-1次選擇排序 int minIndex=i;//假設最小值索引在i位置上,則最小值為arr[i] for(int j=i+1;j<arr.length;j++) { if(arr[j]<arr[minIndex]) {//此排序為升序排序,若為降序排序則為arr[j]>arr[minIndex] minIndex=j;//若發現有值小於預先設定的最小索引所在的值,進行索引交換,便於進行索引對應的元素值交換
} } int temp=arr[i];//將假設i位置上的元素值與最小索引位置的元素值交換 arr[i]=arr[minIndex]; arr[minIndex]=temp; } } public static void main(String[] args) { int[] arr= {101,34,119,1}; System.out.println("選擇排序前:"); System.out.println(Arrays.toString(arr)); selectsort(arr); System.out.
println("選擇排序後:"); System.out.println(Arrays.toString(arr)); } }

執行結果:
在這裡插入圖片描述
在這裡插入圖片描述
從上圖可以看出:選擇排序一共進行arr.length-2次大迴圈,因為最後一個元素已經沒有必要再次進行排序,且資料有n個只需要進行n-1次選擇排序。

四、選擇排序演算法效能測試

package Sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class SelectSort {
	public static void selectsort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {// //最後一個元素沒有必要給它排序,即資料有n個只需要進行n-1次選擇排序
			int minIndex=i;//假設最小值索引在i位置上,則最小值為arr[i]
			for(int j=i+1;j<arr.length;j++) {
				if(arr[j]<arr[minIndex]) {//此排序為升序排序,若為降序排序則為arr[j]>arr[minIndex]
					minIndex=j;//若發現有值小於預先設定的最小索引所在的值,進行索引交換,便於進行索引對應的元素值交換
				}
			}
			int temp=arr[i];//將假設i位置上的元素值與最小索引位置的元素值交換
			arr[i]=arr[minIndex];
			arr[minIndex]=temp;
		}
	}

	public static void main(String[] args) {
		int[] arr = new int[80000];
		for (int i = 0; i < 80000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一個[0, 8000000) 數
		}

		Date date1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//SimpleDateFormat是Java提供的一個格式化和解析日期的工具類
		String date1Str = simpleDateFormat.format(date1);
		System.out.println("選擇排序前的時間是:" + date1Str);
		selectsort(arr);
		Date date2 = new Date();
		String date2Str = simpleDateFormat.format(date2);
		System.out.println("選擇排序後的時間是:" + date2Str);
	}
}

選擇排序前的時間是:2021-01-31 12:21:58
選擇排序後的時間是:2021-01-31 12:21:59

選擇排序測試80000個數據一共需要1s左右的時間。