2 氣泡排序及優化

2021-10-22 19:16:25 字數 1909 閱讀 2421

演算法思路:

每一趟排序都將無序區中的最大值放到最後。通過從左向右依次進行相鄰資料的大小比較,來將最大值一點一點的移動到最後。

演算法特點:

每趟排序可能進行多次交換,每次交換都是相鄰元素之間的交換;

穩定排序;

/** * 基礎的氣泡排序

*/public

static

void

bubblesort1

(int

arr)

}}氣泡排序在輸入的資料是正序時最快,再輸入的資料是逆序時最慢。

即使輸入的資料已經是正序的,使用基礎的氣泡排序依舊是要進行比較的。例如,待排序的陣列是 int arr = ,氣泡排序在第一趟排序時並沒有交換資料,接下來的7趟排序完全是多餘的,因此提出了一種優化,使用額外的乙個標記,來記錄本次排序是否進行過交換,如果沒有進行交換表示當前已經是有序的,不需要進行進行。

/**

* 當某一趟冒牌排序時沒有發生交換,表明此時陣列已經排好序了。

* 增加乙個標誌位,減少無用的比較。

*/public

static

void

bubblesort2

(int

arr)}if

(flag)

break;}

}

如果發生了交換就記錄每趟排序最後一次發生交換的位置,並將其作為下一次排序的結束邊界。

主要用於解決待排序陣列中,無序區的後面一小半區域是有序的情況,減少排序次數。

/**

* 記錄每趟氣泡排序時最後一次發生交換的下標,在這個下標之後的都是有序的。

*/public

static

void

bubblesort3

(int

arr)

}// 更新結束邊界

k = pos;

pos =0;

}}

雙向氣泡排序,又叫雞尾酒排序(cocktail sort)。先從左往右比較一次,再從右往左比較一次,然後又從左往右比較一次,以此類推。

雙向排序主要是為了優化前面的大部分元素都已經排好序的陣列的排序。例如對於陣列 [2,3,4,5,6,7,8,9,1],如果使用普通的氣泡排序,需要比較8次,而換成雙向氣泡排序,只需比較3次。

/**

* 單純的雙向排序,先進行一次從左到右的排序,再進行一次從右到左的排序

*/public

static

void

bubblesort4

(int

arr)

right--

;for

(int i = right; i > left; i--

) left++;}

}

/**

* 優化ii和優化iii結合

*/public

static

void

bubblesort5

(int

arr)}if

(!flag)

break

; flag =

false

; right = pos;

for(

int i = right; i > left; i--)}

if(!flag)

break

; flag =

false

; left = pos;

}}

氣泡排序及優化

氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有n個數,則要進行n 1趟比較。在第1趟比較中要進行n 1次兩兩比較,在第 j 趟比較中要進行 n j 次兩兩比較。實現如下 include define n 10 int main for i 0 i n...

氣泡排序及優化

只考慮演算法的實現 public static void version1 int array 如果陣列的某一部分本身就是有序的,能顯著減少迴圈的趟數 public static void version2 int array if flag break 分析 我們假設在進行某趟排序時已經有序了,以...

氣泡排序及優化

目錄 一 思路 二 普通寫法 三 模板寫法 四 優化一 五 優化二 六 優化三 氣泡排序 無序區,有序區 從無序區通過交換找出最大元素放到有序區前端。1 比較相鄰元素,如果第乙個比第二個大,交換他們。2 對每一對相鄰元素做同樣操作,從開始第一對倒最後一對。這步做完後,最後的元素是最大的。3 針對所有...