氣泡排序演算法的思想:
首先將第乙個記錄的關鍵字和第二個關鍵字進行比較,若為逆序則將兩個記錄進行交換。
然後比較第二個記錄和第三個記錄的關鍵字,直至第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 ...