各種排序的時間複雜度和空間複雜度,穩定性
直接插入排序
就是把未排序的元素一個一個插入到有序的集合中
public static void insertionSort(int []arr){ for(int i=1;i<arr.length;i++){ insertToRightPosition(arr,i); } } private static void insertToRightPosition(int []arr,int i){ int inserted=arr[i]; int j =i-1; for(;j>=0&&arr[j]>inserted;j--){ arr[j+1]=arr[j]; } arr[j+1]=inserted; }
i指向待插元素,j會遍歷有序陣列中所有元素,直到找到合適的位置將待插元素插入
選擇排序
選擇排序就是不斷地從未排序的元素中選擇最大(最小)的元素放入已排好序的元素集合中,直到未排序中僅剩一個元素
private static void selectSort(int []arr){ for(int i=0;i<arr.length-1;i++){ //i下標左邊是已拍好序的元素,右邊(包括i)是無序區間 //最小值下標預設是無序區間第一個元素下標 int minIndex=i; //找到最小值 for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[minIndex]){ minIndex=j; } } swap(arr,minIndex,i); } }
氣泡排序
第一趟比較下來,把最大(最小)的元素交換到最後一個
private static void BubbleSort(int []arr){
int temp=0;
for(int i=0;i<arr.length-1;i++){//一共n-1趟
for(int j = 0;j<arr.length-1-i;j++){//第i+1趟時,需要比較arr.length-1-i次
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}