在要排序的一組數中,假設前n-1個數已經拍好順序,現將第n個數插到有序數列中,使這n個數也是排序好的,如此迴圈,直到全部排好順序。o(n^2)
**實現:
void
insertsort
(int array,int length)
else}}
}複製**
在要排序的陣列中,選擇最小(或者最大)的數與第1個位置的數交換。然後在剩下的數中再找最小(或者最大)的數與第2個位置的數交換。以此類推,直到第n-1個元素與第n個元素比較為止。複雜度:o(n^2)
**實現:
void
selectsort
(int arr)
}if(minindex != i)
}}複製**
演算法改進:二元選擇,簡單選擇排序,每趟迴圈只能確定乙個元素排序後的定位。我們可以考慮改進為每趟迴圈確定兩個元素(當前趟最大和最小記錄)的位置,從而減少排序所需的迴圈次數。
兩個數比較大小,較大的數下沉,較小的數冒出。
過程:比較相鄰資料,若第二個數小,就交換位置:從後向前兩兩比較,一直到比較最前兩個資料最終最小資料被交換到起始位置,則第乙個最小數字置排好:重複上述過程,將剩餘數排好。
**實現:
void
bubblesort
(int arr)}}
}複製**
優化:多數時候,資料排好順序後,演算法仍會進行下一輪比較,知道arr.length-1次,後面的比較無意義。此時可設定標誌位flag,用於標誌某一趟排序過程是否有資料交換,若未發生交換,則可立即結束排序。
void
bubblesort
(int arr)
}if(!flag)
break;
}}複製**
改進方案:1.設定一標誌性變數pos。用於記錄每躺排序中最後一次進行交換的位置。由於pos位置之後的記錄均已交換到位,故下一趟排序只要掃到pos位置即可。
void
bubble
(int r)
i = pos; //為下一趟做準備
}}複製**
基本思想:
先從數列中取出乙個數作為key值;
將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊;
對左右兩個小數列重複第二步,直至各區間只有1個數。
輔助理解:挖坑填數
1.初始時 i = 0; j = 9; key=72
由於已經將a[0]中的數儲存到key中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。
從j開始向前找乙個比key小的數。當j=8,符合條件,a[0] = a[8] ; i++ ; 將a[8]挖出再填到上乙個坑a[0]中。
這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。
這次從i開始向後找乙個大於key的數,當i=3,符合條件,a[8] = a[3] ; j-- ; 將a[3]挖出再填到上乙個坑中。
陣列:72 6 57 88 60 42 83 73 48 85
0 1 2 3 4 5 6 7 8 9複製**
2.此時 i = 3; j = 7; key=72
再重複上面的步驟,先從後向前找,再從前向後找。
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出。
此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將key填入a[5]。
陣列:48 6 57 88 60 42 83 73 88 85
0 1 2 3 4 5 6 7 8 9複製**
3.可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。
陣列:48 6 57 42 60 72 83 73 88 85
0 1 2 3 4 5 6 7 8 9複製**
**實現:
void
quicksort
(int a,int l,int r)
複製**
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...