雙向氣泡排序(氣泡排序的改進優化)

2021-10-01 07:45:20 字數 1629 閱讀 3500

思想:

雙向氣泡排序

首先從前往後兩個兩個比較把大的數移到最後乙個位置,然後從後往前兩個兩個比較把小

的的數後往前推到陣列第乙個位置,這一過程就是第一輪這個時候第乙個位置就是陣列的

最小值,最後乙個位置就是陣列的最大值了然後把front++,behind--,在front與

behind之間再重複操作上述過程最終就會把整個陣列從小到大排列好。

假如輸入的無序陣列為:198

542設定乙個front等於第乙個數1的下標,behind等於最後乙個數2的下標

也就是int front =

0,behind=n-1;

(n為陣列長度)

先從前面開始,每兩個兩個比較,把大的數往後推

第一次兩兩比較交換:198

542第二次兩兩比較交換:189

542 第三次兩兩比較交換:185

942.

..最後一次兩兩比較交換:185

429 這個時候最大值已經到了最後乙個位置

執行**:behind--;(讓behind指向現在陣列的倒數第二個元素2,因為最後乙個元

素已經是在他應該在的位置了)

從後面開始往前走

第一次兩兩比較交換:185

249第二次兩兩比較交換:182

549第三次兩兩比較交換:128

549.

..然後就把1確定為最小的值放在了第乙個位置

這個時候執行**:front++;(因為front本來是指向第乙個元素,現在的話,第乙個

元素已經的找到是最小的了,就不用再管了)

這個時候的front和behind之間的元素就變成了:285

4front指向2,behind指向4,再重複上述過程

直到front=behind時,就是已經排序完畢,再輸出即可

typedef

struct

type;

//雙向氣泡排序

void

bidirectionalbubblesort

(type r,

int n,

int comparecount,

int movecount)}if

(!flag)

//若flag還是等於0,即表明沒有進行交換,就是說已經有無需進行下一步了序的

break

; behind--

;for

(int i = behind; i > front; i--)}

front++

; movecount++

;printf

("第%.2d趟排序的結果:"

, movecount)

;for

(int k =

0; k < n; k++

)printf

("\n");

}printf

("比較次數為:%d\n"

, comparecount)

;//比較次數

printf

("移動次數為:%d\n"

, movecount)

;//移動次數

}

改進 優化 冒泡法排序

class bubblesort j static void print int mintarr i static void change refint i1,ref inti2 static void bubblesort int a,outintn 如果查詢一次後發現不需交換,說明已經排完序 可...

選擇排序,氣泡排序,雙向氣泡排序

氣泡排序和選擇排序是最基本的排序方式,要掌握。氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。選擇排序每一趟從待排序的 資料元素 中選出最小 或最大 的乙個元素,順序放在已排好序的數列的...

選擇排序,氣泡排序,雙向氣泡排序

首先是選擇排序,原理 1 找到未排序的數中最小的數放到最前面 2 陣列後移一位 3 重複上面兩部。void selectsorting if min a i swap b i b t 這個應該是我第乙個接觸到的排序演算法,結果第一次打排序水題直接上冒泡,直接接了一發tle 才知道有nlogn的演算法...