(排序一)氣泡排序+選擇排序+歸併排序
阿新 • • 發佈:2018-12-17
氣泡排序:
從陣列末尾開始依次與姓林的進行比較,如果a[i]<a[i+1] 交換位置,這樣在第一輪比較後最大的冒在第0位置,然後再從末尾開始比較,然後次大的在第1的位置,依此類推
時間複雜度:O(n^2)
額外空間複雜度:O(1)
public static void popsort(int []arr) { if (arr == null || arr.length < 2) { return; } for(int i=0;i<arr.length-1;i++) { for(int j=arr.length-1;j>i;j--){ if (arr[j-1] < arr[j]) swap(arr, j, j - 1); } } }
選擇排序:
從第0個位置開始,遍歷一遍陣列選擇最大的放在第一個位置,然後遍歷2~n位置,選最大的放在第二個位置。每次遍歷一遍得到最大的放在第i位置
時間複雜度:O(n^2)
額外空間複雜度:O(1)
public static void choosort(int []arr) { if (arr == null || arr.length < 2) { return; } for(int i=0;i<arr.length-1;i++) { for(int j=i+1;j<arr.length;j++) { if(arr[i]<arr[j]) swap(arr, i, j); } } }
程式碼2:
public static void choosort2(int []arr) {
if (arr == null || arr.length < 2) {
return;
}
for(int i=0;i<arr.length-1;i++) {
int maxIndex=i;
for(int j=i+1;j<arr.length;j++) {
if(arr[maxIndex]<arr[j])
maxIndex=j;
}
swap(arr,maxIndex,i);
}
}
插入排序:
從第1位置開始,與前面的比較
第i次迴圈,第i位置的數與前面的依次比較,如果大於前面的,交換,繼續比較,直到前面的數比自己大停止。
時間複雜度:O(n^2)
額外空間複雜度:O(1)
public static void insertsort(int []arr) {
if (arr == null || arr.length < 2) {
return;
}
for(int i=1;i<arr.length;i++) {
for(int j=i;j>0;j--)
{
if(arr[j]>arr[j-1])
swap(arr,j,j-1);
if(arr[j]<=arr[j-1])
break;
}
}
}
swap函式:
private static void swap(int [] arr,int i, int j) {
int t;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
三個排序的穩定性分析:
插入排序和氣泡排序可以做到穩定性(相同大小的數保持原來位置)
選擇排序不可以(在進行交換時,比如第2位置是一個較小的數數字0與後面的選擇出來的最大的數交換時,可能會越過中間的數字0)