1. 不用中间变量,用两种方法交换A和B的值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 1.中间变量
void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}
// 2.加法
void swap(int a, int b) {
    a = a + b;
    b = a - b;
    a = (a - b)/2;
}
// 3.异或(相同为0,不同为1. 可以理解为不进位加法)
void swap(int a, int b) {
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}
2. 求最大公约数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21/** 1.直接遍历法 */
int maxCommonDivisor(int a, int b) {
    int max = 0;
    for (int i = 1; i <= b; i++) {
        if (a % i == 0 && b % i == 0) {
            max = i;
        }
    }
    return max;
}
/** 2.辗转相除法 */
int maxCommonDivisor(int a, int b) {
    int r;
    while(a % b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return b;
}
// 扩展:最小公倍数 = (a * b)/最大公约数
3. 排序算法
选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:
都将数组分为已排序部分和未排序部分。
1). 选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
2). 冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
3). 插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。
- 选择排序1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23NSMutableArray *selectArr = [NSMutableArray arrayWithArray:@[@"13",@"5",@"89",@"20",@"40",@"18",@"120"]]; 
 for (int i = 0; i < selectArr.count - 1; i++) {
 for (int j = i + 1; j < selectArr.count; j++) {
 if ([selectArr[i] integerValue] > [selectArr[j] integerValue]) {
 NSString *temp = selectArr[i];
 selectArr[i] = selectArr[j];
 selectArr[j] = temp;
 }
 }
 }
 //【选择排序】最值出现在起始端
 void selectSort(int *arr, int length) {
 for (int i = 0; i < length - 1; i++) { //趟数
 for (int j = i + 1; j < length; j++) { //比较次数
 if (arr[i] > arr[j]) {
 int temp = arr[i];
 arr[i] = arr[j];
 arr[j] = temp;
 }
 }
 }
 }
- 冒泡排序1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23NSMutableArray *dataArr = [NSMutableArray arrayWithArray:@[@"13",@"5",@"89",@"20",@"40",@"18",@"120"]]; 
 for (int i = 0; i < dataArr.count - 1; i++) {
 for (int j = 0; j < dataArr.count - 1 - i; j++) {
 if ([dataArr[j] integerValue] > [dataArr[j+1] integerValue]) {
 NSString *temp = dataArr[j];
 dataArr[j] = dataArr[j+1];
 dataArr[j+1] = temp;
 }
 }
 }
 //【冒泡排序】相邻元素两两比较,比较完一趟,最值出现在末尾
 void bublleSort(int *arr, int length) {
 for(int i = 0; i < length - 1; i++) { //趟数
 for(int j = 0; j < length - i - 1; j++) { //比较次数
 if(arr[j] > arr[j+1]) {
 int temp = arr[j];
 arr[j] = arr[j+1];
 arr[j+1] = temp;
 }
 }
 }
 }
- 插入排序1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11// 第一步我们取出第二数 然后让 第二个数与第一个数比较 如果 第二个数< 第一个数 那么我们就将数组第二个数的位子换成第一个数的值 然后 j-- 
 NSMutableArray *insertArr = [NSMutableArray arrayWithArray:@[@"13",@"5",@"89",@"20",@"40",@"18",@"120"]];
 for (int i = 1; i < insertArr.count; i++) {
 int j = i;
 NSString *temp = insertArr[i];
 while (j > 0 && [insertArr[j] integerValue] < [insertArr[j-1] integerValue]) {
 [insertArr replaceObjectAtIndex:j withObject:insertArr[j-1]];
 j--;
 }
 [insertArr replaceObjectAtIndex:j withObject:temp];
 }
- 希尔排序1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15// 类似于对半查找 但又不一样 
 NSMutableArray * hillArr = [NSMutableArray arrayWithArray:@[@"13",@"5",@"89",@"20",@"40",@"18",@"120"]];
 int gap = hillArr.count/2;
 while (gap >= 1) {
 for (int i = gap; i < hillArr.count; i++) {
 NSString *temp = hillArr[i];
 int j = i;
 while (j >= gap && [temp integerValue] < [hillArr[j-gap] integerValue]) {
 [hillArr replaceObjectAtIndex:j withObject:hillArr[j-gap]];
 j -=gap;
 }
 [hillArr replaceObjectAtIndex:j withObject:temp];
 }
 gap = gap/2;
 }
- 快排4. 折半查找(二分查找)1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25- (void)qkSortArr:(NSMutableArray *)kArr low:(NSInteger)low hight:(NSInteger)hight{ 
 if (low >= hight) {
 return;
 }
 NSInteger i = low;
 NSInteger j = hight;
 NSString *temp = kArr[low];
 while (i < j) {
 while (i < j && [temp integerValue] <= [kArr[j] integerValue]) {
 j--;
 }
 kArr[i] = kArr[j];
 while (i < j && [temp integerValue] >= [kArr[i] integerValue]) {
 i++;
 }
 kArr[j] = kArr[i];
 }
 kArr[i] = temp;
 [self qkSortArr:kArr low:low hight:i-1];
 [self qkSortArr:kArr low:i+1 hight:hight];
 }折半查找:优化查找时间(不用遍历全部数据) 
 折半查找的原理:
 1). 数组必须是有序的
 2). 必须已知min和max(知道范围)
 3). 动态计算mid的值,取出mid对应的值进行比较
 4). 如果mid对应的值大于要查找的值,那么max要变小为mid-1
 5). 如果mid对应的值小于要查找的值,那么min要变大为mid+1
| 1 | - (NSInteger)binarySearchArr:(NSArray *)arr withLow:(NSInteger)low withHight:(NSInteger)hight withSelcetID:(NSString *)key{ | 
