排序演算法--交換篇(冒泡,快排)
1.氣泡排序
演算法思想:反覆掃描待排序記錄序列,在掃描的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。第一趟排序不斷地將相鄰兩個記錄中關鍵字大的記錄向後移動,第二趟將前n-1個記錄進行同樣的操作,結果次大的記錄被放在n-1個記錄的位置。如此反覆,每趟排序都將一個記錄排序到位,直到剩下一個最小的記錄。
private static void BubbleSort(int[] a) { int temp=0; for (int i = 0; i < a.length-1; i++) { for (int j = 0; j < a.length-i-1; j++) { if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } }
演算法分析:例如陣列[48,62,35,77,55,14,35,98,22,40],第一趟後[48,35,62,55,14,35,77,22,40,98],第二趟後[35,48,55,14,35,62,22,40,77,98],第三躺[35,48,14,35,55,22,40,62,77,98],第四趟[35,14,35,48,22,40,55,62,77,98],第五趟[14,35,35,22,40,48,55,62,77,98],第六趟[14,35,,22,35,40,48,55,62,77,98],最後[14,22,35,35,40,48,55,62,77,98]
時間複雜度O(n^2) 空間複雜度O(1) 穩定
2.快速排序
演算法思想:從待排序記錄序列中選取一個記錄(通常取第一個)為樞軸,其關鍵字K1,然後將其餘關鍵字小於k1的記錄移到前面,大於的數字放在後面,結果將待排序記錄序列分為兩個子表,最後將關鍵字為K1的記錄插到其分界線的位置。
private static void QKSort(int[] a,int low,int high) { int pos; if(low<high){ pos=QKPass(a,low,high); QKSort(a,low,pos-1); QKSort(a,pos+1,high); } } //一趟快速排序 private static int QKPass(int[] a, int low, int high) { int x=a[low];//選擇基準位置 while(low<high){ while(low<high&&a[high]>x) high--;//high從右到左找小於x的記錄 if(low<high){//找到小於x的記錄,則送入空單元a[low] a[low]=a[high]; low++; } while(low<high&&a[low]<x)//low從左到右找大於x的記錄 low++; if(low<high){//找到大於x的記錄,則送入空單元a[high] a[high]=a[low]; high--; } } a[low]=x;//將基準記錄儲存到low=high的位置 return low;//返回基準記錄的位置 }
演算法分析:例如序列{48,62,35,77,55,14,35,98}
一次劃分後:{35,14,35}48{55,77,62,98}分別進行快速排序
第二次劃分:{14} 35 {35} 48 55{62}77{98}
快速排序遞迴演算法的執行過程對應一棵二叉樹,理想情況下是一棵完全二叉樹,遞迴工作棧的大小與上述遞迴呼叫二叉樹的深度對應,平均情況下輔助空間複雜度為O(log2n) 時間複雜度O(nlog2n) 不穩定