三大簡單排序

2021-07-11 01:27:27 字數 3448 閱讀 6986

氣泡排序:

(一)概念及實現

氣泡排序的原理:重複的遍歷要排序的陣列,每次遍歷過程中從頭至尾比較兩個相鄰的元素,若順序錯誤則交換兩個元素。

具體如下(實現為公升序):

設陣列為a[0…n]。

1. 從頭至尾比較相鄰的元素。如果第乙個元素比第二個元素大,就交換。

2. 重複步驟1,每次遍歷都將冒出乙個最大數,直到排序完成。

實現**:

void ballocsort(int a,int n)

} if(flag == 0)

break;

}}

(二)演算法複雜度

1. 時間複雜度:o(n^2)

氣泡排序耗時的操作有:比較 + 交換(每次交換兩次賦值)。時間複雜度如下:

1) 最好情況:序列是公升序排列,在這種情況下,需要進行的比較操作為(n-1)次。交換操作為0次。即o(n)

2) 最壞情況:序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。交換運算元和比較運算元一樣。即o(n^2)

3) 漸進時間複雜度(平均時間複雜度):o(n^2)

2. 空間複雜度:o(1)

從實現原理可知,氣泡排序是在原輸入陣列上進行比較交換的(稱「就地排序」),所需開闢的輔助空間跟輸入陣列規模無關,所以空間複雜度為:o(1)

(三)穩定性

氣泡排序是穩定的,不會改變相同元素的相對順序。

(四)優化改進

1. 有序優化:在進行相鄰元素比較時,可以記錄下迴圈中沒有發生交換的多個連續索引對(起始索引和結束索引),在下次輪詢時直接對有序區間的最大值進行比較。

2. 雙向冒泡:參考資料過程中看到了雙向冒泡,不同之處在於「從左至右與從右至左兩種冒泡方式交替執行」,個人認為不能提高演算法效率並且增加**複雜度。

選擇排序:

(一)概念及實現

選擇排序的原理:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

具體如下(實現為公升序):

設陣列為a[0…n]。

1. 初始狀態:無序區為r[1..n],有序區為空。

2. 第1趟排序。在無序區r[1..n]中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[1]交換,使r[1..1]和r[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

3. 第i趟排序。第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 r[k],將它與無序區的第1個記錄r交換,使r[1..i]和r分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

實現**:

void selectsort(int a,int n)

}if(flag!=i)

}}

(二)演算法複雜度

1. 時間複雜度:o(n^2)

選擇排序耗時的操作有:比較 + 交換 。時間複雜度如下:

1) 最好情況:序列是公升序排列,在這種情況下,需要進行的比較操作為(n-1)次。交換操作為0次。即o(n)

2) 最壞情況:序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。交換運算元n/2次。即o(n^2)

3) 漸進時間複雜度(平均時間複雜度):o(n^2)

2. 空間複雜度:o(1)

從實現原理可知,選擇排序是在原輸入陣列上進行比較交換的(稱「就地排序」),所需開闢的輔助空間跟輸入陣列規模無關,所以空間複雜度為:o(1)

(三)穩定性

選擇排序是給每個位置選擇當前元素最小的,比如給第乙個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它乙個最大的元素了。那麼,在一趟選擇,如果乙個元素比當前元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是乙個不穩定的排序演算法。

(四)優化改進

由於選擇排序在第i趟都要進行(n-i)次比較,但其實這些比較在其後每趟中都會再進行重複的比較。所以最好的就是將比較的結果儲存下來,這樣就不用做很多重複無用的比較操作了。我們的解決方案就是用樹結構來記錄比較的結果。好了,就不賣關子了,其實就是堆排序。大家有興趣的可以下去看看,這也是很重要的排序,必須得掌握的。

插入排序:

(一)概念及實現

選擇排序的原理:把待排序的紀錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到乙個新的有序序列。

具體如下(實現為公升序):

設陣列為a[0…n]。

1. 設定監視哨r[0],將待插入紀錄的值賦值給r[0];

2. 設定開始查詢的位置j;

3. 在陣列中進行搜尋,搜尋中將第j個紀錄後移,直至r[0].key≥r[j].key為止;

4. 將r[0]插入r[j+1]的位置上。

實現**:

void insertsort(int a,int n)

a[j+1] = base;

}}

(二)演算法複雜度

1. 時間複雜度:o(n^2)

選擇排序耗時的操作有:比較 + 交換 。時間複雜度如下:

1) 最好情況:序列已經是公升序排列了,在這種情況下,需要進行的比較操作需(n-1)次即可。即o(n)

2) 最壞情況:序列是降序排列,那麼此時需要進行的比較共有n(n-1)/2次。插入排序的賦值操作是比較操作的次數加上 (n-1)次。即o(n^2)

3) 漸進時間複雜度(平均時間複雜度):o(n^2)

2. 空間複雜度:o(1)

從實現原理可知,選擇排序是在原輸入陣列上進行比較交換的(稱「就地排序」),所需開闢的輔助空間跟輸入陣列規模無關,所以空間複雜度為:o(1)

(三)穩定性

插入排序是在乙個已經有序的小序列的基礎上,一次插入乙個元素。當然,剛開始這個有序的小序列只有1個元素,就是第乙個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其後面,否則一直往前找直到找到它該插入的位置。如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。

(四)優化改進

1, 折半插入排序。將直接插入排序中尋找a[i]的插入位置的方法改為採用折半比較,即可得到折半插入排序演算法。

2,希爾排序。又稱縮小增量排序。希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

十大簡單排序 快速排序

思想 選定乙個元素做中軸,一般是陣列最後乙個元素,從兩頭遍歷陣列,左邊比中軸大的元素和右邊小於等於中軸的元素對換,當左游標大於等於右游標的時候,左游標處的值一定是大於中軸值的,將左游標處的值與末尾的中軸值交換,就完成了第一次的分割,接下來,對中軸兩邊的陣列段再次進行上述相同的處理。最終就得到了排序好...

十大簡單排序 計數排序

思想 用乙個例子來說明計數排序的思想,對n個50 59之間的整數進行排序,n可能很大。雖然資料量很大,但是取值範圍卻很小,我們可以利用乙個陣列a 10 a 0 a 9 對應50.59,也就是說,資料減去50作為陣列的下標,例如56,那麼對應的下標就是56 50 6,那麼a 6 執行一次加1操作,代表...

三種簡單排序

1.氣泡排序 氣泡排序是一種簡單的排序演算法,其基本思想如下 1 從第乙個開始起,比較相鄰的兩個元素的大小,如果前乙個比後乙個大,則進行交換 也就是小的冒上去 2 然後再和之前相鄰元素進行比較,若小,則冒上去。2 重複以上操作,直到最後乙個元素。1 public static void bubble...