冒泡演算法的改進

2021-06-19 20:04:29 字數 2056 閱讀 8038

氣泡排序演算法的思想:

首先將第乙個記錄的關鍵字和第二個關鍵字進行比較,若為逆序則將兩個記錄進行交換。

然後比較第二個記錄和第三個記錄的關鍵字,直至第n-1個記錄和第n個記錄進行比較為止,一趟過後最大的元素會沉入最底部。

然後進行第二趟排序,對前 n-1 個記錄進行同樣1、2的操作,結果就是關鍵字次大的記錄被安排到n-1位置上。

依次進行第 i 趟排序,對前 n-i 個記錄進行同樣的1、2的操作,直到一趟沒有進行過任何比較的操作,排序結束。

先看一下基礎冒泡演算法:

int bubblesort(mergetype* l)

} } return 0;

}

這裡的mergetype型別如下:

typedef struct _sqlistsqlist, *psqlist;

typedef _sqlist mergetype;

核心思想是每次選出最大的數沉入底部,直至沒有資料可比較。

首先計算一下它的時間複雜度,這裡以最壞的情況來計算的話:

(n-1)+(n-2)+……+ 1 + 0 = n*(n-1)/ 2  = o(n^2)

最好的情況就是已經排序好,不需要進行比較

首先看到其不足之一:就是頻繁交換元素。如何避免,可以存放在乙個合適的位置,精簡演算法一:

int bubblesortex(mergetype* l)

} //printf("%d:%d \n", max, temp);

swap(l->elem[l->len-1-i], l->elem[max] );

} return 0;

}

看到這裡每次仍然需要頻繁的進行賦值操作,當然只是微不足道的,但是賦值也會增加cpu執行的時間,所以精簡演算法二:

int bubblesortex(mergetype* l)

} //printf("%d:%d \n", max, l->elem[max]);

swap(l->elem[l->len-1-i], l->elem[max] );

} return 0;

}

這裡的兩個swap是不一樣的,當然也可以使用一樣的,看如下具體的實現:

#define swap(a, b) \

inline void swap(int& a, int& b)

第乙個是採用巨集替換,當然主要是增加預處理的時間,主要是用巨集會出現意想不到的錯誤

第二個是函式,這裡使用了引用,可以減少指標使用的形參變數副本的建立,但是這裡使用了inline,所以還是替換

測試程式:

int printlist(mergetype *l);

int scanflist(mergetype *l, const int nscanftype = -1);

int sorttest()

資料輸入:

int scanflist(mergetype *l, const int nscanftype)

printf("old list\t: ");

for (int i = 0; i <= l->len; i++ )

switch (nscanftype)

default:

l->elem[i] = 11 * i - i * i;

break;

} printf("%d ", l->elem[i]);

} return 0;

}

資料輸出:

int printlist(mergetype *l)

printf("sort list\t: ");

for (int i = 0; i <= l->len; i++ )

printf("%d ", l->elem[i]);

} return 0;

}

改進的氣泡排序演算法

氣泡排序演算法,是最基本的排序演算法,它屬於交換排序。設想被排序的陣列r 1.n 垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上 漂浮 交換位置 如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。若記...

改進的氣泡排序演算法

氣泡排序演算法,是最基本的排序演算法,它屬於交換排序。設想被排序的陣列r 1.n 垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上 漂浮 交換位置 如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。若記...

氣泡排序及其改進演算法

第乙個排序函式 sort1 為氣泡排序的典型實現,第二和第三個為改進後的排序函式 include include define len 20000 double sort1 int int double sort2 int int double sort3 int int int main int ...