【排序演算法】—— 氣泡排序、選擇排序
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)