氣泡排序及優化

2021-09-22 20:12:49 字數 1515 閱讀 3594

目錄

一、思路

二、普通寫法

三、模板寫法

四、優化一

五、優化二

六、優化三

氣泡排序:(無序區,有序區)。從無序區通過交換找出最大元素放到有序區前端。

1、比較相鄰元素,如果第乙個比第二個大,交換他們。

2、對每一對相鄰元素做同樣操作,從開始第一對倒最後一對。這步做完後,最後的元素是最大的。

3、針對所有元素重複以上步驟,除了最後乙個。

4、持續每次對越來越少的元素重複以上步驟,直到沒有一對數字需要比較。

void bubblesort(vector&v)}}

}

templatevoid bubblesort(t arr, int len)

}

}

}

假設我們現在排序arr=這組資料,按照上面排序方式,第一趟排序後將10和9交換已經有序,接下來的8趟排序就是多餘的,什麼也沒有做。所以我們可以在交換的地方做乙個標記,如果那一趟排序沒有交換元素,說明這組資料已經有序,不用再繼續下去。

void bubblesort(vector&v)

}if (flag == 0) // 如果沒有交換過元素,則已經有序}}

優化一僅適用於連片有序而且整體無序的資料(如:1, 2, 3, 4,7, 6, 5)。但是對於前面大部分是無序而後邊小半部分有序的資料(1, 2, 5, 7, 4, 3, 6, 8, 9, 10)排序效率也不客觀。對於這種型別資料,我們可以繼續優化。我們可以記下最後一次交換的位置,後邊沒有交換,必然是有序的,然後下一次排序從第乙個比較到上次記錄的位置結束即可。

優化二的效率有很大提公升,還有一種優化方法可以繼續提高效率。大致思想就是一次排序可以確定兩個值,正向掃瞄找到最大值交換到最後,反向掃瞄找到最小值交換到最前面。例如:排序資料1, 2, 3, 4, 5, 6, 0.

k = lastchangepos; // 下一次比較到記錄位置即可

// 反向查詢最小值

for (j = k; j > n; j--)

n++;

if (flag == 0) return;}}

氣泡排序及優化

氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有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 分析 我們假設在進行某趟排序時已經有序了,以...

氣泡排序及優化

氣泡排序通常是最早接觸的一種排序 原理是 假設是按照從小到大的順序排列 每一次遍歷都會把當前的最大值歸置到應有的位置,在下一次遍歷時忽略最後的已經歸置好的,在前面未排序的部分再次重複,每一次遍歷都不能少。void bubblea int num,int size size是陣列規模 在此基礎上加乙個...