算法——冒泡排序

1、冒泡排序      原理:1、冒泡排序就是取出第n個數字,然後和 第n + 1  個數字相比較,如果arr[n] > arr[n + 1],則調換兩個的位置                 2、直到 n = 數組總數量 – 1 , 完成對於數組的遍歷,保證最大的數據放到最後的位置。                 3、n ++ ,直到 n = 數組總量 – 1,否則重複前兩步 事例:

 
NSInteger
i , j ;
   

for
(i =
0
;i < n ;i ++ ) {
       

for
(j =
1
; j < n – i; j ++) {
           

if
(arr[j –
1
] > arr[j]) {
               

int
temp = arr[j –
1
];
                arr[j –

1
] = arr[j];
                arr[j] = temp;
            }
        }

    }



優化:
(1)           依照冒泡排序的原理可知,每次循環,arr[n]都會和arr[n+1]相比較,如果在本次排序中,沒有發生位置變化,則,可知冒泡排序已經完成,就不必再繼續下面的操作了,所以,可以設置標記,如果在某次循環中沒有任何的數據變化,則表示所有的數據已經有了序列。      
 
NSInteger
i,j;
   

BOOL
flag =
YES
;
   

for
(i =
0
; i < n && flag ==
YES
; i ++) {
        flag =

NO
;
       

for
(j =
1
; j < n – i; j ++) {
           

if
(arr[j –
1
] > arr[j]) {
                flag =

YES
;
               

int
temp = arr[j –
1
];
                arr[j –

1
]  = arr[j];
                arr[j] = temp;
            }
        }

    }


(2)           對已第一種優化來說,還有一個問題,就是說,我們在排序的過程中,依舊是需要從頭遍歷到尾的去排序,根據冒泡算法的原理,可以知道,每次排序的最後一次調換位置n 和 n+1,即表示arr[n]之後的數據都已經是有序的,所以我們只需要記住 n ,並下次排列時,只排列 n 之前的數字即可。

   
 
NSInteger
i ,k;
   

NSInteger
flag = n;
   

while
(flag >
0
) {
        k = flag;
        flag =

0
;
       

for
(i =
1
; i < k ; i ++) {
           

if
(arr[i –
1
] > arr[i]) {
               

int
temp = arr[i –
1
];
                arr[i –

1
] = arr[i];
                arr[i] = temp;
                flag = i;
            }
        }

    }

点赞