演算法 c 氣泡排序 優化

2021-09-29 06:27:09 字數 1959 閱讀 5403

氣泡排序是一種交換排序,實現比較簡單,其原始版本如下

void bubsort(int a, int n)

}}

而我們討論的重點是它的優化。

有序陣列:指按一定順序排列的陣列;

無序陣列:指不滿足一定排列順序的陣列;

對於氣泡排序,本文預設為前小後大排序方式,

也就是在排序過程中被運算元組的前面是無序的,後面逐漸變成有序,直到整個陣列有序。

插旗優化思路很簡單明瞭,就是在資料排序完成後插個旗,表明資料是否已經有序,進而避免多餘的迴圈。例如有陣列12354

顯然,第二次的時候就可以結束迴圈了。

void bubsort(int a, int n)

if (flag==0)//判斷有無旗子

break;//終止迴圈

}}

排序的時候,發生陣列無序但陣列後半部分有序的情況,這時後面有序部分可封起來,作為下一輪迴圈的頂,否則每次迴圈會多浪費時間去掃瞄這些有序部分。例如

陣列32145.

一 3 2 1 4 5

二 2 1 3 4 5

三 1 2 3 4 5

四 1 2 3 4 5

顯然,45重複掃瞄了多次。

void bubsort(int a, int n)

last = p;//封頂。

}}

# 優化三

對於雙向冒泡的原理也容易理解,就是同時從兩邊對陣列進行掃瞄和交換,一次找出最大值和最小值。

void bubsort(int a, int n)

hi = top;//封頂

for (int j=hi; j>lo; j--)//從後到前掃瞄

if (a[hi]等等,分析一下時間複雜度,雖然雙向冒泡的外部迴圈少了執行次數,但內部變成兩次迴圈,和單向冒泡都是o(n^2),到底在什麼地方優化呢?

我們再看看我做的簡單的對照表

column 1

column 2

0.219

26.246

0.19

21.106

0.16

18.413

依次為單向冒泡,單向冒泡(插旗+封頂),雙向冒泡在陣列大小分別為10000,100000時執行的時間。

注:**時間均為三次執行的中值,使用rand(),資料從實驗方面來說不嚴謹,但這裡只為說明雙向冒泡確實做到了優化。

為什麼雙向能做到優化呢?

很簡單雙向氣泡排序自帶了封頂優化(封底從另一方面也可以看作封頂)。也就是說雙向的優化和封頂優化的原理相同,甚至雙向不僅封頂,而且還封底,比單向封頂還要好一點。

相信看到題目,大家馬上就能想到原理,這裡就不贅述了。

void

bubsort

(int a,

int n)

hi = top;

if(flag==0)

break

; flag =0;

for(

int j=hi; j>lo; j--)if

(a[j]

) lo = top;

if(flag==0)

break

; flag =0;

}}

這就是氣泡排序最終優化版本(雙向插旗)了。

————————————————

注意!原版氣泡排序的時間是穩定的,但我們所做的優化是對資料有點敏感的,所以優化後的版本雖然時間複雜度還是o(n^2),但如果用測試的時候,執行時長會隨著資料的變化而變化。

我的個人hexo部落格.

氣泡排序 氣泡排序演算法優化

常用的排序演算法主要包括 1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 簡單選擇排序 堆排序快速排序 4 歸併排序其中,氣泡排序算是最簡單的一種排序演算法 public class bubble int temp 0 for int i 0 iarr j 1 ...

排序演算法 氣泡排序 優化

排序演算法在程式設計中起到非常大的作用,氣泡排序是其中比較經典的演算法。雖然效率不高,但是每個演算法都有適合的場景。氣泡排序就是在排序過程中相鄰元素不斷交換,看起來向元素冒泡一樣。那我們就可以通過新增乙個標誌位來對氣泡排序進行優化處理。因為,在某一次排序的過程中可能需要排序的陣列已經是有序的了,在這...

C 氣泡排序 氣泡排序的優化

本文包含氣泡排序的三種實現方式 分別為氣泡排序初級版,公升級版,終級版 自己起的名字 使用時只要使用終極版就本以了,終級版為公升級版的優化版本 至於初極版和公升級版只是為了幫助理解 氣泡排序的時間複雜度為o n include include include include include incl...