冒泡排序的核心思路
- 整個冒泡排序過程中包含多次冒泡操作。每一次冒泡操作都會遍歷整個數(shù)組,依次對數(shù)組中相鄰的元素進行比較,看是否滿足大小關(guān)系要求,如果不滿足,就將它們互換位置。一次冒泡操作會讓至少一個元素移動到它應(yīng)該在的位置,重復(fù)n次,就完成了n個數(shù)據(jù)的排序工作。
冒泡排序的操作流程。
- 假設(shè)要對一個數(shù)組a[6]從小到大順序進行排序。第一步操作,先比較a[0]和a[1]的大小,如果a[0]>a[1],則將a[0]和a[1]交換位置,如果a[0]<a[1],則不交換位置。完成這一步操作后,再對a[1]和a[2]進行比較,操作原則同上。一直比較到最后,則a[5]就是這個數(shù)組中的最大值,已經(jīng)在數(shù)組的末尾了。
- 第二步操作再次進行a[0]和a[1]的比較,一直比較到a[4],就把數(shù)組的第二大的元素放在了a[4]的位置了。
- 按照這樣的原則,依次重復(fù)操作,比較到只剩a[0]的時候,就排好序了。
冒泡排序的相關(guān)
- 冒泡排序是原地排序算法,是穩(wěn)定排序算法。
- 冒泡排序的平均時間復(fù)雜度為O(n2)
- 我們可以利用一個BOOL值去記錄某次冒泡操作是否進行了數(shù)據(jù)的交換,如果沒有進行數(shù)據(jù)操作,則說明數(shù)組以達到完全有序的狀態(tài),不需要繼續(xù)執(zhí)行后續(xù)冒泡操作了,直接結(jié)束排序就可以了。
簡單的代碼實現(xiàn)
- (void)bubbleSort
{
NSMutableArray *numberArray = [NSMutableArray arrayWithArray:@[@5,@1,@6,@2,@4,@3]];
NSLog(@"排序之前的結(jié)果:%@",numberArray);
for (int i = 0; i<numberArray.count; i++) {
BOOL isNeedBreak = YES;
for (int j = 0; j<(numberArray.count-i-1); j++) {
if ([numberArray[j] intValue] > [numberArray[j+1] intValue]) {
NSNumber *numberTmp = numberArray[j];
numberArray[j] = numberArray[j+1];
numberArray[j+1] = numberTmp;
isNeedBreak = NO;
}
}
if (isNeedBreak == YES) {
break;
}
}
NSLog(@"排序之后的結(jié)果:%@",numberArray);
}
c