改良 氣泡排序演算法

2021-09-30 07:50:59 字數 2100 閱讀 6388

最近講第二個大課題——陣列。

講到陣列,肯定不可避免的就要講到兩個排序演算法了,冒泡演算法首當其衝。

整理了一下氣泡排序的內容,我跟學生說:「要你們掌握兩個東西,乙個是演算法思想,乙個是核心**。」

演算法思想如下:

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排序法使...