最近講第二個大課題——陣列。
講到陣列,肯定不可避免的就要講到兩個排序演算法了,冒泡演算法首當其衝。
整理了一下氣泡排序的內容,我跟學生說:「要你們掌握兩個東西,乙個是演算法思想,乙個是核心**。」
演算法思想如下:
1.
將相鄰兩個數比較,將小(大)的調到前頭。
最後排序結果,從小到大(從大到小);
每輪比較後,最大(小)值「沉底
」。
若有
n個數,需進行
n-1輪比較,假設
j為當前比較輪數,則
此輪需進行
n-j次兩兩相鄰數的比較。
核心**如下:
for(int j=0;j<9;j++)
for(int i=0;i<9-j;i++)
if(a[i]>a[i+1])
//t
為已定義變數
不過這學期在備這個課的那麼一瞬間,我突然想起,以前黃煜廉同志說過可以對這個排序演算法進行改良的。
傳統的氣泡排序存在缺陷:氣泡排序演算法一般情況下,總要執行比較
(n-1)*n/2
次;
2.
1.
程式進行任何動作,都是用資料來說話,而在程式中操縱資料,就要用到變數,於是,我們派個「內奸」去「觀察」陣列是否已排好序的方式就是引入乙個變數,通過比對變數的值來判斷陣列是否已排好序,如:int s;s為0是表示排好序,s為1時表示未排好序。
那麼,陣列什麼情況下才是已排好序呢?——當在一輪比較當中,沒有出現資料交換的情況,則表示當前陣列中每相鄰的兩個資料都是後面的比前面大(或者小),也就是已處於有序狀態。
這麼一來,問題就簡單了,「看陣列是否已有序的問題」轉化為了「看在當前輪的兩兩比較中是否有出現交換這個動作的問題」了。
所以我們要做的事情有如下3個動作:1、在每輪比較開始之前,將s的值置為0;2、在每輪比較進行中,當出現資料交換的時候,把s的值置為1;3、在每輪比較結束之後,觀察s的值,如果是0,則退出氣泡排序演算法,如果是1,則繼續進行氣泡排序演算法。
根據這個設想,我們把源程式更改如下:
2.for(int j=0;j<9;j++)
//t為已定義變數
if(s==0)break;
}
但是有些特殊情況,比如:
陣列元素本就排好序的,或者經過
若干次比較交換後,陣列已經排好序的,
可以不需要
比較(n-
1)*n/2
次再跳出氣泡排序演算法,當程式「觀察
」到陣列已經處於
「排好序
」的狀態,即刻跳出氣泡排序演算法,結束比較;
shaker 排序法 改良的氣泡排序 C
include include shaker 排序法 改良的氣泡排序 採用雙向進行 先讓氣泡排序由左向右進行,再來讓氣泡排序由右往左進行 如此完成一次排序的動作,而您必須使用left與right兩個旗標來記錄左右兩端已排序的元素位置。如 乙個排序的例子如下所示 排序前 45 1977 8113 28...
冒泡演算法以及其改良(java實現)
氣泡排序是一種非常簡單的排序演算法,核心思想就是相鄰的兩個記錄進行兩兩比較,如果不滿足排序條件就交換,滿足就不交換,例子 給定乙個陣列a int i,j for i 0 i 要注意的是 i是因為最下面的i個數已經排好了沒必要再排了 for j 0 j 注意判斷條件,這個與我們想要的結果相反 if a...
排序演算法 heap排序 改良的交換排序演算法
說明 選擇排序法的概念簡單,每次從未排序部份選一最小值,插入已排序部份的後端,其時間主要花費於在整個未排序部份尋找最小值,如果能讓搜尋最小值的方式加快,選擇排序法的速率也就可以加快,heap排序法讓搜尋的路徑由樹根至最後乙個樹葉,而不是整個未排序部份,因而稱之為改良的選擇排序法。解法heap排序法使...