8種排序演算法

2021-08-17 10:17:48 字數 1797 閱讀 6839

1. 選擇排序

兩層迴圈巢狀,0到n-1選出最小的,與第0個交換,縮小集合為1到n-1,選出最小的,與第乙個交換……

時間複雜度:o(n2),

空間複雜度:因為中間只增加了兩個新變數,儲存最小值和下標,所以空間複雜度為o(1)

當陣列為已排序狀態時,仍需要n次比較,最好的情況仍需要o(n2)

public static void selectsort(int array)				

}array[x] = array[i];

array[i] = min;

} }

2. 氣泡排序

兩兩比較,將較大的值放後面,第一次迴圈結束後,最大值在最後,二次迴圈後,次大值在倒數第二個……

若某次迴圈,未發生任何交換,則說明佇列已排序。

時間複雜度:o(n2),

空間複雜度:因為中間只增加了乙個temp值做輔助,所以空間複雜度為o(1)

當陣列為已排序狀態時,只需要一次迴圈,n次比較,最好的情況只需要o(n)

public static int bubblesort(int array) 

}} return array;

}

3. 插入排序

向前面已排號的序列中插入新的值,第二層巢狀裡,需要比較值,並向後移動。

時間複雜度: o(n2)

空間複雜度: o(1)

當對已排序陣列處理時,第二層巢狀裡不需要向後移動,最好的情況時間複雜度為o(n)

public static void insertsort(int array)

array[j + 1] = currentvalue;

} }

4. 歸併排序

這是一種遞迴的排序演算法,將陣列分成兩組,分別排序,再合併一起。排序的總數為n,n/2,n/4,n/8……

排序在合併時,需要使用乙個輔助陣列。

時間複雜度:o(nlogn)

空間複雜度:o(n)

最好的情況時,即資料已排序的情況,時間複雜度為仍為o(nlogn)

public static void mergesort(int array) 

} public static int conarray(int array1, int array2)

else

} while(i < m)

while(j < n)

return temp;

}

5. 快速排序

選擇第乙個值作為主元,將剩餘值分列主元的兩邊,這時主元的位置是正確的位置,遞迴的呼叫這個方法,將所有的值作為主元,確定位置。

時間複雜度: o(nlogn)

空間複雜度: o(1) 不需要輔助陣列

最差的情況下,主元將陣列分成乙個空陣列和乙個完整陣列,時間複雜度為o(n2)

public static void quicksort(int array) 

public static void quicksort(int array, int first, int last)

} public static int partition(int array, int first, int last)

} while (high > first && array[high] >= pivot)

high--;

if (pivot > array[high]) else

return pivot;

}

8種排序演算法

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說...

8種排序演算法

public class sortcode a j 1 insertnum 找到位置,插入當前元素 system.out.println 直接插入排序後的陣列為 arrays.tostring a 2.希爾排序 針對直接插入排序的下效率問題,有人對次進行了改進與公升級,這就是現在的希爾排序。希爾排序...

8種排序演算法總結

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void sortnumber method2 int array,int length ...