氣泡排序是非常容易理解和實現,以從小到大排序舉例:
設陣列長度為n。
氣泡排序從前往後遍歷和從後往前遍歷一樣的原理。
目標陣列:3,5,2,6,4,9,7,12,11
從前往後:
第一波:從第乙個數開始,如果第乙個數大於第二個數,就把這兩個數調換位置,否則保留之前的排列,第二次把第二個和第三個數比較,比較方式同上,這樣經過第一波比較後,留在最後面的數是整個陣列中最大的數;
第二波:由於第一波比較出了陣列中最大的數在最後面(n的位置),所以第二波比較的時候只要遍歷到n-1的位置就可以了,可以將這一波中得出的最大得數放在n-1的位置。
第三波,第四波. . . ..
這樣比較n-1波【一共(n-1)! 次】
二、 直接插入排序
直接插入排序(insertionsort)的基本思想是:每次將乙個待排序的記錄,按其關
鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成
為止。
設陣列為a[0…n-1]。
1. 初始時,a[0]自成 1 個有序區,無序區為a[1..n-1]。令 i=1
2. 將 a[i]併入當前的有序區 a[0…i-1]中形成 a[0…i]的有序區間。
3. i++並重複第二步直到 i==n-1。排序完成。
三、 直接選擇排序
直接選擇排序和直接插入排序類似,都將資料分為有序區和無序區,所不同的是
直接插入排序是將無序區的第乙個元素直接插入到有序區以形成乙個更大的有
序區,而直接選擇排序是從無序區選乙個最小的元素直接放到有序區的最後。
設陣列為a[0…n-1]。
4. 初始時,陣列全為無序區為 a[0..n-1]。令 i=0
5. 在無序區 a[i…n-1]中選取乙個最小的元素, 將其與 a[i]交換。 交換之後 a[0…i]
就形成了乙個有序區。
6. i++並重複第二步直到 i==n-1。排序完成。
四、 快速排序
快速排序由於排序效率在同為 o(n*logn)的幾種排序方法中效率較高, 因此經常
被採用,再加上快速排序思想——分治法也確實非常實用,因此很多軟體公司的
方面的考試如軟考,考研中也常常出現快速排序的身影。
總的說來,要直接默寫出快速排序還是有一定難度的,因此本人就自己的理解對
快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。
快速排序是c.r.a.hoare 於 1962 年提出的一種劃分交換排序。它採用了一種分
治的策略,通常稱其為分治法(divide-and-conquermethod)。
該方法的基本思想是:
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它
的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
雖然快速排序稱為分治法, 但分治法這三個字顯然無法很好的概括快速排序的全
部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:
先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現代
碼會有幫助) 。
以乙個陣列作為示例,取區間第乙個數為基準數。
初始時,i =0; j = 9; x = a[i] = 72
由於已經將a[0]中的數儲存到 x 中,可以理解成在陣列 a[0]上挖了個坑,可以將
其它資料填充到這來。
從 j 開始向前找乙個比 x 小或等於 x 的數。當 j=8,符合條件,將 a[8]挖出再填
到上乙個坑a[0]中。a[0]=a[8]; i++; 這樣乙個坑 a[0]就被搞定了,但又形成了一
個新坑a[8],這怎麼辦了?簡單,再找數字來填 a[8]這個坑。這次從 i 開始向後
找乙個大於 x的數,當 i=3,符合條件,將 a[3]挖出再填到上乙個坑中 a[8]=a[3];
j--;
陣列變為:
i = 3; j = 7; x=72
再重複上面的步驟,先從後向前找,再從前向後找。
從 j 開始向前找,當 j=5, 符合條件, 將 a[5]挖出填到上乙個坑中, a[3] = a[5]; i++;
從 i 開始向後找,當 i=5 時,由於 i==j 退出。
此時,i =j = 5,而 a[5]剛好又是上次挖的坑,因此將 x 填入 a[5]。
陣列變為:
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對 a[0…4]
和a[6…9]這二個子區間重複上述步驟就可以了。
對挖坑填數進行總結
1.i =l; j = r; 將基準數挖出形成第乙個坑 a[i]。
2.j--由後向前找比它小的數,找到後挖出此數填前乙個坑 a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑 a[j]中。
4.再重複執行 2,3 二步,直到 i==j,將基準數填入 a[i]中。
package test2;
/** * @author lee
* */
public class paixu ;*/
int a =;
//maopaosort1(a);
//maopaosort2(a);
//zjxz(a);
quicksort(a, 0, a.length-1);
for(int k=0;ka[j+1])
}} }
/*** @description 氣泡排序2 - 優化
* 設定乙個標誌,如果這一趟發生了交換,則為true,否則為
* false。明顯如果有一趟沒有發生交換,說明排序已經完成
* @time 2023年3月5日 下午6:45:39
* @author lee
* @return void
*/static void maopaosort2(int a)
}//每次遍歷的長度-1
j--;
} }/**
* * @description 直接插入排序1
* @time 2023年3月7日 下午8:44:04
* @author lee
* @return void
*/static void zjcr1(int a) }
/*** 直接選擇排序
* @author lee 2023年3月12日 下午2:21:15
*/static void zjxz(int a)
if(i
while(i
if(i
}a[i] = x;
//遞迴呼叫
quicksort(a, l, i-1);
quicksort(a, i+1, r);
} }}
四種排序演算法
今天整理了一下幾種常見的排序 冒泡,選擇,插入,和快速排序演算法實現。第一種,氣泡排序 具體實現 相鄰的兩個元素比較,後面的元素大於前面的元素,交換位置。public static int maopaosort int arr return arr 選擇排序具體實現 每次把陣列中第乙個元素作為最小值...
C 四種排序演算法
c 四種排序演算法 sabine 本文介紹了c 的四種排序演算法 氣泡排序 選擇排序 插入排序 和希爾排序 氣泡排序 using system namespace bubblesorter public class mainclass bubblesorter sh new bubblesorter...
C 四種排序演算法
四種排序演算法 氣泡排序 選擇排序 插入排序和希爾排序 氣泡排序 using system namespace bubblesorter j public class mainclass bubblesorter sh new bubblesorter sh.sort iarrary for int...