1.冒泡排序
- A.比较相邻的两个元素,如果前一个比后一个大,那就交换两个元素的位置
- B.所以需要两个for循环进行排序比较
//冒泡排序
- (void)bubbleSortWithArray:(NSMutableArray *)array
{
for (int end = (int)array.count; end > 0; end --) {
for (int i = 1; i < end; i ++) {
NSNumber *a = array[i];
NSNumber *b = array[i - 1];
if ([a integerValue] < [b integerValue]) {
array[i] = b;
array[i - 1] = a;
}
}
}
}
//冒泡排序优化1
//如果某次循环完成之后,发现并没有走交换的代码,说明已经是排序好的了,直接break
- (void)bubbleSortTwoWithArray:(NSMutableArray *)array
{
for (int end = (int)array.count; end > 0; end --) {
BOOL sortComplete = YES;
for (int i = 1; i < end; i ++) {
NSNumber *a = array[i];
NSNumber *b = array[i - 1];
if ([a integerValue] < [b integerValue]) {
array[i] = b;
array[i - 1] = a;
sortComplete = NO;
}
}
if (sortComplete) {
break;
}
}
}
//冒泡排序优化2
//记录最后一次交换的位置,并赋值给end,下次循环到end位置截止
- (void)bubbleSortThreeWithArray:(NSMutableArray *)array
{
for (int end = (int)array.count; end > 0; end --) {
int recordLast = 1;
for (int i = 1; i < end; i ++) {
NSNumber *a = array[i];
NSNumber *b = array[i - 1];
if ([a integerValue] < [b integerValue]) {
array[i] = b;
array[i - 1] = a;
recordLast = i + 1;
}
}
end = recordLast;
}
}
2.选择排序
- A.每次循环找到数组中最大的元素,交换最大元素与最后一个元素的值
- B.所以需要两个for循环进行比较
//选择排序
- (void)selectSortWithArray:(NSMutableArray *)array
{
for (int end = (int)array.count; end > 0; end --) {
NSInteger maxIndex = 0;
for (int i = 0; i < end; i ++) {
NSInteger maxV = [array[maxIndex] integerValue];
NSInteger iV = [array[i] integerValue];
if (iV > maxV) {
maxIndex = i;
}
}
NSNumber *maxN = array[maxIndex];
array[maxIndex] = array[end - 1];
array[end - 1] = maxN;
}
}
3.堆排序
- A.堆排序的效率更高,本文不进行代码演示,后期会补上
网友评论