冒泡排序、選擇排序、直接插入排序

冒泡排序

比較相鄰的元素,若是第一個比第二個大,就交換他們。第一步全部相鄰的排序作完後,最大的數字會在最右邊,接着重複步驟。算法

public class Main {

public static void main(String[] args) {
int[] array={9,5,2,6,1,3,8,4,10,7};
for (int i=0;i<array.length;i++){
for (int j=0;j<array.length-i-1;j++){
if (array[j]>array[j+1]){
int number=array[j];
array[j]=array[j+1];
array[j+1]=number;

}

}
}

for (int number:array){
System.out.println(number);
}
}
}

控制檯輸出:
1
2
3
4
5
6
7
8
9
10

 假設參與比較的數組元素個數爲 N,則第一輪排序有 N-1 次比較,第二輪有 N-2 次,如此類推,這種序列的求和公式爲:數組

 

  (N-1)+(N-2)+...+1 = N*(N-1)/2spa

    當 N 的值很大時,算法比較次數約爲 N2/2次比較,忽略減1。排序

 假設數據是隨機的,那麼每次比較可能要交換位置,可能不會交換,假設機率爲50%,那麼交換次數爲 N2/4。不過若是是最壞的狀況,初始數據是逆序的,那麼每次比較都要交換位置。class

  交換和比較次數都和N2 成正比。因爲常數不算大 O 表示法中,忽略 2 和 4,那麼冒泡排序運行都須要 O(N2) 時間級別。隨機數

  其實不管什麼時候,只要看見一個循環嵌套在另外一個循環中,咱們均可以懷疑這個算法的運行時間爲 O(N2)級,外層循環執行 N 次,內層循環對每一次外層循環都執行N次(或者幾分之N次)。這就意味着大約須要執行N2次某個基本操做。循環

 

 

選擇排序 

選擇排序是每一次從待排序的數據元素中選出最小的一個元素,存放在序列的起始位置,直到所有待排序的數據元素排完。數據

 
public class Main {

public static void main(String[] args) {
int[] array={9,5,2,6,1,3,8,4,10,7};
for (int i=0;i<array.length-1;i++){
int min=i;
for (int j=i+1;j<array.length;j++){
if (array[j]<array[i]) {
min=j;
if (i!=j){
int number=array[i];
array[i]=array[min];
array[min]=number;
}
}
}
}

for (int number:array){
System.out.println(number);
}
}
}
 
控制檯輸出:
1
2
3
4
5
6
7
8
9
10
 

       選擇排序和冒泡排序執行了相同次數的比較:N*(N-1)/2,可是至多隻進行了N次交換。static

 

  當 N 值很大時,比較次數是主要的,因此和冒泡排序同樣,用大O表示是O(N2) 時間級別。可是因爲選擇排序交換的次數少,因此選擇排序無疑是比冒泡排序快的。當 N 值較小時,若是交換時間比比較時間大的多,那麼選擇排序是至關快的。移動

 

直接插入排序

 

插入排序是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完全部元素爲止。

 
public class Main {

public static void main(String[] args) {
int[] array = {9, 5, 2, 6, 1, 3, 8, 4, 10, 7};
int j;

for (int i=1;i<array.length;i++){
int number=array[i];
j=i;
while (j>0&&number<array[j-1]){
array[j]=array[j-1];
j--;
}
array[j]=number;
}


for (int number : array) {
System.out.println(number);
}

}
}
 
控制檯輸出:
1
2
3
4
5
6
7
8
9
10


 在第一輪排序中,它最多比較一次,第二輪最多比較兩次,一次類推,第N輪,最多比較N-1次。所以有 1+2+3+...+N-1 = N*(N-1)/2。

  假設在每一輪排序發現插入點時,平均只有全體數據項的一半真的進行了比較,咱們除以2獲得:N*(N-1)/4。用大O表示法大體須要須要 O(N2) 時間級別。

  複製的次數大體等於比較的次數,可是一次複製與一次交換的時間耗時不一樣,因此相對於隨機數據,插入排序比冒泡快一倍,比選擇排序略快。

這裏須要注意的是,若是要進行逆序排列,那麼每次比較和移動都會進行,這時候並不會比冒泡排序快。

相關文章
相關標籤/搜索