先列下代码,算法的实现细节可以参考网上,这里只提供可运行、调试的代码。
#define Tick NSDate *startTime = [NSDate date];
#define Tock NSLog(@"Time: %f",-[startTime timeIntervalSinceNow]);
@property (nonatomic, strong) NSMutableArray *ArrayM;
self.ArrayM = [NSMutableArray array];
for (int i = 0; i<= 10; i++) {
[self.ArrayM addObject:@(arc4random()%50)];
}
冒泡排序
- (void)method1 {
Tick
//冒泡,循环两层遍历
// 1.将最大的数字排到最后
for (int i = 0; i<self.ArrayM.count - 1; i++) {
//.i从0开始排序,到数组倒数第二位(为什么到倒数第二位呢?因为冒泡本质是交换,当排到倒数第二位的时候,已经是和最后一位做交换了,所以就可以停止循环了)
for (int j = 0; j<self.ArrayM.count-1-i; j++) {
//.j从0开始,而且每次都是从0开始,冒泡每次都会挑选出最大或者最小,排到最后面。所以内层循环的次数逐次递减
if ([self.ArrayM[j] intValue] > [self.ArrayM[j + 1] intValue]) {
//.当前位置与后面一个位置最比较(所以要考虑到数组越界的问题,j的范围)
NSNumber *temp = self.ArrayM[j];
self.ArrayM[j] = self.ArrayM[j + 1];
self.ArrayM[j + 1] = temp;
}
}
}
Tock
}
选择排序
- (void)method2 {
Tick
for (int i = 0; i < self.ArrayM.count - 1; i ++) {
//i从0开始,还是循环到数组的倒数二位,本质还是交换,先比较之后,再做交换,最后一个没有可以比较的,所以不用循环了
int min = i;
for (int j = i; j < self.ArrayM.count - 1; j ++) {
//.内层循环 j 从i开始的位置开始,选择排序是把有序的排到前面
//.
if ([self.ArrayM[min] intValue] > [self.ArrayM[j + 1] intValue]) {
min = j + 1;
}
}
NSNumber *temp = self.ArrayM[i];
self.ArrayM[i] = self.ArrayM[min];
self.ArrayM[min] = temp;
}
//
Tock
}
插入排序
- (void)method4 {
Tick
for (int i = 1; i < self.ArrayM.count; i++) {
NSNumber *insertNum = self.ArrayM[i];
int j = i - 1;
for (;j>=0 &&insertNum.intValue < [self.ArrayM[j] intValue]; j--) {
self.ArrayM[j + 1] = self.ArrayM[j];
}
self.ArrayM[j + 1] = insertNum;
}
Tock
}