基本思想:交換排序顧名思義就是將兩個數進行比較來交換兩個數在記錄中的位置,例如6 4 2 5 例如6和2進行比較,(由小到大排序)6和2交換位置
主要算法
1》.冒泡排序
冒泡排序:待排序數從後往前 或者從前往後 兩兩比較,若爲逆序則交換,知道所有的數都比較完,則爲一趟排序,每一趟排序後就有一個數被確定在最終位置。舉個例子:
所以 ,在冒泡排序中最主要要學到的就是 怎麼進行兩兩交換數的思想
//核心算法
//A是待排序數組 n是表長
public void BubbleSort(int[] A,int n ){
int i,j;
//i代表排序的趟數
for(i=0;i<n;i++){
//j工作指針 從後往前排 每排一次就會少一個數參與排序
for(j=n-1;j>i;j--){
if(A[j]<A[j-1]){
//交換兩個數 這個在很多算法中都有應用
int temp=A[j];
A[j]=A[j-1];
A[j-1]=temp;
}
}
}
}
2》快速排序
快速排序是一種比較重要的排序的算法 其基於分治思想的算法。
舉一個通俗的例子來理解:有5個人 每個人手裏都拿有棒棒糖 現在老師讓這5個人按手裏棒棒糖多少進行排序 此時大家都不知道彼此手裏的棒棒糖 那麼怎麼排序呢?這時就需要一個參照(基準元素),此時第一個人就說:我來做參照,如果比我手裏棒棒糖多的就站在我的左邊 比我少的就站在我的右邊。爲了效率 最左邊和最右邊就定了一個規則,假設從最左邊開始比較 如果左邊的人手裏棒棒糖比參照多就還是左邊的人與參照比較(即從左往右的方向進行),但是如果一遇到比參照小 那麼就需要把比較出來較小的這個人交換到右邊位置 此時左邊的人就要等右邊的人與參照進行比較了......按這個思想來看下面的例子
從過上面的一趟排序後,3 8 9 21 11 25 19 所得我們可以得出的結論是:
1.基準元素9左邊的元素都比基準元素小,右邊的元素都比基準元素大
2.進行第二次排序時 顯然9就不需要再參與排序 而是分別對9左邊和右邊分別進行上面一樣的算法---這就是遞歸思想
代碼實現:
package suanfa;
public class InsertSort4 {
//找基準元素
int part(int A[],int low,int high){
int pivot;//基準元素
pivot=A[low];//把數組元素的第一個值作爲數組元素
//一趟排序結束跳出的條件
while(low<high){
//左邊的元素大於基準元素 就從左往右進行比較
while(low<high && A[high]>=pivot)
high--;
A[low]=A[high];
//右邊的元素小於基準元素就從右往左進行比較
while(low<high && A[low]<=pivot)
low++;
A[high]=A[low];
}
//一趟排序結束 將基準元素放在最終位置
A[low]=pivot;
//將基準元素返回
return low;
}
//快速排序
void Quicksort(int A[],int low,int high){
if (low<high) {
//獲得基準的位置
int positition=part(A, low, high);
//進行遞歸排序
Quicksort(A, low, positition-1);
Quicksort(A, positition+1, high);
}
}
//測試
public static void main(String[] args) {
int[] A={2,12,6,8,11,31,18};
int n =A.length-1;
InsertSort4 insertSort = new InsertSort4();
insertSort.Quicksort(A, 0, n);
for(int i=0;i<=n;i++){
System.out.println(A[i]);
}
}
}