由傳統泡沫排序法可以看出有一個缺點是不管資料是否以排序完成都固定會執行 n(n-1)/2 次, 而我們可以藉由在程式中加入一判斷式來加以判斷何時可以提前中斷程式, 又可以得到正確的資料, 來增加程式的執行效能.
範例代碼 :
- #include
- using namespace std;
- struct BenchMark {
- int swapTime;
- int verifyTime;
- };
- BenchMark advanceBubbleSort(int data[], int n) {
- int cnt = 0, vt=0, flag=0; // flag 是用來判斷是否已完成排序並跳出的比較的迴圈
- BenchMark bm;
- for(int i=n-1; i>0; i--) {
- flag = 0;
- for(int j=0; j
- vt++;
- if(data[j+1] < data[j]) {
- int tmp = data[j+1];
- data[j+1] = data[j];
- data[j] = tmp;
- cnt++;
- flag++;
- }
- }
- if(flag==0) { // 完成排序, 故不需要 swap
- break;
- }
- }
- bm.swapTime = cnt;
- bm.verifyTime = vt;
- return bm;
- }
- void main(bool b) {
- if(b) {
- int data[6] = {2,5,9,7,6,8};
- cout<< "原始資料: " << endl;
- for(int i=0; i<6; i++) {
- printf("%2d ",data[i]);
- }
- printf("\n");
- BenchMark bm = advanceBubbleSort(data, 6);
- cout << "改良泡沫排序: " << endl;
- for(int i=0; i<6; i++) {
- printf("%2d ",data[i]);
- }
- printf("\n");
- printf("Swap time: %d\n", bm.swapTime);
- printf("Verify time: %d\n", bm.verifyTime);
- }
- }
沒有留言:
張貼留言