進一步地改進氣泡排序演算法

2021-05-24 01:07:08 字數 1492 閱讀 1611

交換排序是指在排序過程中,主要是通過待排序記錄序列中元素間關鍵字的比較,與儲存位置的交換來達到排序目的一類排序方法。

1.1 氣泡排序的基本思想

氣泡排序是交換排序中一種簡單的排序方法。它的基本思想是對所有相鄰記錄的關鍵字值進行比效,如果是逆順(a[j]>a[j+1]),則將其交換,最終達到有序化。其處理過程為:

(1)將整個待排序的記錄序列劃分成有序區和無序區,初始狀態有序區為空,無序區包括所有待排序的記錄。

(2)對無序區從前向後依次將相鄰記錄的關鍵字進行比較,若逆序將其交換,從而使得關鍵字值小的記錄向上"飄浮"(左移),關鍵字值大的記錄好像石塊,向下"墮落"(右移)。

每經過一趟氣泡排序,都使無序區中關鍵字值最大的記錄進入有序區,對於由n個記錄組成的記錄序列,最多經過n-1趟氣泡排序,就可以將這n個記錄重新按關鍵字順序排列。

1.2 氣泡排序演算法

原始的氣泡排序演算法

對由n個記錄組成的記錄序列,最多經過(n-1)趟氣泡排序,就可以使記錄序列成為有序序列,第一趟定位第n個記錄,此時有序區只有乙個記錄;第二趟定位第n-1個記錄,此時有序區有兩個記錄;以此類推,演算法框架為:

for(i=n;i>1;i--)

若定位第i個記錄,需要從前向後對無序區中的相鄰記錄進行關鍵字的比較,它可以用如下所示的語句實現。

for(j=1;j< =i-1;j++)

if (a[j].key>a.[j+1].key)

下面給出完成的氣泡排序演算法:

void bubblesort1 (datatype a,int n)

} }

改進的氣泡排序演算法

在氣泡排序過程中,一旦發現某一趟沒有進行交換操作,就表明此時待排序記錄序列已經成為有序序列,氣泡排序再進行下去已經沒有必要,應立即結束排序過程。

改進的氣泡排序演算法:

void bubblesort2 (datatype a,int n)

if (exchange==0) break; }

}進一步地改進氣泡排序演算法

在前面給出的氣泡排序演算法的基礎上,如果我們同時記錄第i趟氣泡排序中最後一次發生交換操作的位置m(m<=n-i),就會發現從此位置以後的記錄均已經有序,即無序區範圍縮小在a[1]至a[m]之間,所以在進行下一趟排序操作時,就不必考慮a[m+1]至a[n]範圍內的記錄了,而只在a[1]至a[m]範圍內進行。

完整的演算法:

void bubblesort3 (datatype a,int n)

if (exchange==0)break; }

}氣泡排序比較簡單,當初始序列基本有序時,氣泡排序有較高的效率,反之效率較低;其次氣泡排序只需要乙個記錄的輔助空間,用來作為記錄交換的中間暫存單元;氣泡排序是一種穩定的排序方法。

進一步改進小遊戲

原 print 我愛errorchen temp input 不妨猜一下我現在的心裡想的是哪個數字 guess temp if guess 8 print 臥槽,你是我心裡的蛔蟲嗎 print 哼 猜中了也沒有獎勵 else print 猜錯了,我心裡想的是8 print 遊戲結束,不玩啦 增添功能...

堆排序的進一步理解

堆 顧名思義,上面小,下面大,或者上面大,下面小。在堆排序過程中,首先應該建堆。如何將陣列中的元素建立成乙個規範的堆行結構。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最...

堆排序的進一步理解

堆 顧名思義,上面小,下面大,或者上面大,下面小。在堆排序過程中,首先應該建堆。如何將陣列中的元素建立成乙個規範的堆行結構。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最...