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;
}
}
}