iOS 基础算法

冒泡排序

OC

-(void)bubbleSort{
    NSMutableArray *bubbleSortA = @[@6,@10,@7,@8,@20,@21,@9].mutableCopy;
    
    for (int i = 0; i< bubbleSortA.count; i++) {
        //外层for循环控制循环次数
        for (int j = 0 ; j  [bubbleSortA[j +1] intValue]) {
                [bubbleSortA exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }

        }
        
    }
    
    NSLog(@"冒泡排序:%@",bubbleSortA);
}

C

int a[6] = {1,20,19,11,8,7,9,12};
    
    for (int i = 0 ; i<5; i++) {
        for (int j = 0; j < 5 - i; j++) {
            if (a[j] > a[j +1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j+1] = temp;
            }
        }
    }
    printf("按升序排好序的数组:\n");
    for (int i =0 ; i < 6; i++) {
        printf("a[%d] = %d \t ",i,a[i] );
    }

插入排序

#pragma mark---插入排序
-(void)insertSort{
    NSMutableArray *array = @[@11,@9,@1,@13,@8,@10].mutableCopy;
    
    /*从下标y1开始*/
    for (int i = 1; i0 && [temp intValue] < [array[j -1] intValue]) {
                array[j] = array[j-1];
                j --;
            }
            array[j]  = temp;
        }
    }
    
    NSLog(@"%@",array);

}

解释:从第二个开始,取出该位置的值为临时值temp,位置为j,此时j的位置为空,叫做坑,然后temp依次往前比较,直到找到比temp小,把temp插入该的位置,完成一次循环。

插入排序复杂度分析:

从空间上来看,它只需要一个记录的辅助空间,因此关键是看它的时间复杂度。当最好的情况,时间复杂度为O(n)。当最坏的情况,即待排序表示逆序的情况,如{6,5,4,3,2},此时需要比较(n+2)(n-1)/2次,记录的移动次数也达到(n+4)(n-1)/2次。如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n2/4次,因此插入排序法的时间复杂度为O(n2),该排序比冒泡和选择排序的性能要好一些。

希尔排序

-(void)shellSort{
     //起始间隔值gap设置为总数的一半,直到gap==1结束
    NSMutableArray *array =@[@6,@10,@7,@8,@20,@19,@9,@8,@3].mutableCopy;
    int gap = (int)array.count /2;
  
    while (gap >= 1) {
        for (int i = gap; i= gap && [temp intValue] < [array[j-gap]intValue]) {
                [array exchangeObjectAtIndex:j withObjectAtIndex:j-gap];
                j -=gap;
            }
            array[j] = temp;
        }
        gap = gap/2;
    }
    
    
}

希尔排序(Shell Sort):是插入排序算法的一种更高效的改进版本。在这之前冒泡、选择、插入排序的时间复杂度基本都是O(n²)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
官方解释如下:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序在插入排序的基础上增加一个叫增量的概念。那什么增量?插入排序只能与相邻的元素进行比较,而希尔排序则是进行跳跃比较,而增量就是步长。比如增量为3时,下标为0的元素与下标为3的元素比较,3再与6比较,1与4比较,4再与7比较……比较完后,再去减少增量,重复之前步骤,直到增量为1,此时只有一个分组了,再对这一个分组进行插入排序,整个希尔排序就结束了。

选择排序

-(void)selectSort{
    
    //选择排序 思想:两个两个做比较,如果第一个大于第二个就交换,算法思想很简单
    NSMutableArray *array = @[@6,@5,@7,@10,@9,@20,@22,@7,@2,@6,@13].mutableCopy;
    for (int i = 0; i [array[j] intValue]) {
                [array exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
    NSLog(@"%@",array);
    
}

你可能感兴趣的:(iOS 基础算法)