1. 程式人生 > >【排序演算法】—— 氣泡排序、選擇排序

【排序演算法】—— 氣泡排序、選擇排序

1、氣泡排序

這個氣泡排序的原理就像水裡的魚吐泡泡一樣,起初是小一點的泡泡,然後越來越大,最後的最大。


演算法描述:

1)設待排序序列中的記錄的數為n

2)一般的,第i趟起泡排序從1到n-i+1

3)依次比較相鄰兩個記錄的數字,如果發生逆序,則交換

4)其結果是這n-i+1個記錄中,關鍵字最大的記錄被交換到n-i+1的位置上,最多進行n-1次

請看下圖

初識元素序列:8  3  2  5  9  4    6

第一趟排序:    3  2  5  8  4  6 【9】

第二趟排序:    2  3  5  4  6 【8  9】

第三趟排序:    2  3  4  5 【6  8  9】

第四趟排序:    2  3  4 【5  6  8  9】

第五趟排序:    2  3 【4  5  6  8  9】

第六趟排序:    2 【3  4  5  6  8  9】


我們有7個數需要排列,第一趟排列的時候我們需要比較7次,把最大的數 9 排在最後一位。當第二趟排列的時候,我們只需要比較6次把整個數列中第二大的數排在第六位就可以了,因為最後一位整個數列中最大的數,就不需要比較了~以此類推~n個數排列的時候,我們排六趟就可以了~

程式碼展示:

public class sortMethods{

   public static void main(String[] args){

   int a[] = {8,3,2,5,9,4,6}

   bubbleSort(a);

   print(a);

}

//氣泡排序

private static void bubbleSort(int[] a){

  for(int i=0;i<a.length-1;i++){

    for(int j=0;i<a.length-i-1;j++){

      if(a[j]>a[j+1]){

         swap(a,j+1);

}

}

}

}

private static void swap(int[]a,int i, int j){

  int b;

  b = a[i];

  a[i] = a[j];

  a(j) = b;

}

private static void Print(int[] a){

 for(int num:a){

   System.out.print(num+"");

}

 System.out.println();

}

}

演算法評價

1)時間複雜度:T(n)=O(n*n)

a.最好的情況(正序)

比較次數:n-1

移動次數:0

b.最壞的情況(逆序)

比較次數:1/2(n*n-n)


2、選擇排序

演算法描述:

1)首先通過n-1次比較,從n個數中找出最小的, 將它與第一個數交換——第一趟選擇排序,結果最小的數被安置在第一個元素位置上。

2)再通過n-2次比較,從剩餘的n-1個數中找出關鍵字次小的記錄,將它與第二個數交換——第二趟選擇排序。

3)重複上述過程,共經過n-1趟排序後,排序結束。


第一趟找到整個數列中最小的那個數,把它和整個數列的第一位交換位置,然後找到第二小的數,把它和第二位書交換位置~以此類推~


程式碼展示:

//選擇排序

private static void selectSort(int[] a){

    for(int i = 0;i<a.length-1;i++){

      int k = i;

           for(int j=i+1;j<a.length;j++){

             if(a[j]<a[k]){

              k = j;

}

}

  if(k! = j){

     swap(a,i,k);

}

}

}

演算法評價:

1)時間複雜度:T(n)=O(n*n)

a.比較次數:1/2(n*n-n)

b.移動次數:

最好情況:0

最壞的情況:3(n-1)