排序演算法之一:氣泡排序&選擇排序&插入排序
1.氣泡排序
原理:比較兩個相鄰的元素,將值大的元素交換至右端。
複雜度:O(n*n)
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。
第一趟比較完成後,最後一個數一定是陣列中最大的一個數,所以第二趟比較的時候最後一個數不參與比較;
第二趟比較完成後,倒數第二個數也一定是陣列中第二大的數,所以第三趟比較的時候最後兩個數不參與比較;
依次類推,每一趟比較次數-1;
public int[] bubbleSort(int[] A, int n) {
// write code here
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(A[j]>A[j+1]){
int temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
}
return A;
}
2.選擇排序
原理:選擇排序是一種簡單直觀的排序演算法,其基本原理如下:對於給定的一組記錄,經過第一輪比較後得到最小的記錄,然後將該記錄的位置與第一個記錄的位置交換;接著對不包括第一個記錄以外的其他記錄進行第二次比較,得到最小記錄並與第二個位置記錄交換;重複該過程,知道進行比較的記錄只剩下一個為止。
複雜度:O(n*n)
public int[] selectionSort(int[] A, int n) {
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(A[i]>A[j]){
int temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
// write code here
return A;
}
3.插入排序
原理:直接插入排序的基本操作是將一個記錄插入到已經排好的有序表中,從而得到一個新的、記錄數增1的有序表。對於給定的一組記錄,初始時假定第一個記錄自成一個有序序列,其餘記錄為無序序列。接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直到最後一個記錄插到有序序列中為止。
public int[] insertionSort(int[] A, int n) {
// write code here
for(int i=1;i<n;i++){
//如果當前數字比前面一個小
if(A[i]<A[i-1]){
int temp=A[i];
int j=i-1;
//遍歷當前數字所有的數字,而且前面數字必須大於temp
for(;j>=0&&temp<A[j];j--){
//前面的數賦值給後面的數
A[j+1]=A[j];
}
A[j+1]=temp;
}
}
return A;
}
複雜度分析:
當最好的情況,也就是要排序的表本身就是有序的,此時只有資料比較,沒有資料移動,時間複雜度為O(n)。
當最壞的情況,即待排序的表是逆序的情況,此時需要比較次數為:2+3+…+n=(n+2)(n-1)/2 次,而記錄移動的最大值也達到了 (n+4)(n-1)/2 次.
如果排序記錄是隨機的,那麼根據概率相同的原則,平均比較和移動次數約為次,因此,得出直接插入排序發的時間複雜度為。從這裡可以看出,同樣的是時間複雜度,直接插入排序法比冒泡和簡單選擇排序的效能要好一些。