简单算法

冒泡排序、选择排序、折半查找

2018-12-15  本文已影响3人  Persistent丧心病狂

简单的算法

选择排序(升序) :第一个依次和第二个、第三个、第四个、、、比较,如果第一个大于(升序)对比的那个,就将俩个数的位置交换,一轮之后,我们得到最小的数字在数组的最左边
然后第二轮从第二个开始依次和第三个、第四个、、、比较,如果大于对比的那个继续交换位置,一直到最后一轮

NSMutableArray *array = [NSMutableArray arrayWithArray:@[@4,@1,@10,@5,@2,@88,@3]];
    for (int i = 0;i < array.count ; i ++) {
        for (int j = 1 + i; j < array.count ; j ++) {
            // 升序
            if ([array[i] integerValue] > [array[j] integerValue]) {
                NSNumber *temp;
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

冒泡排序(升序):第一轮第一个和第二个比较,如果第一个大于(升序)第二个,就将他俩的位置交换,然后第二个和第三个比较,同样,如果第二个大于第三个,交换他俩位置,一直到倒数第二个和最后一个比较,最后得到数组中最大的一个在最右边
第二轮,还是从第一个开始,第一个与第二个比较,如果大于(升序)第二个,将他俩的位置交换,然后第二个和第三个比较,直到倒数第三个与倒数第二个比较,这一轮得到第二大的数放在邮编的倒数第二个位置、、然后第三轮,一直到最后一轮。

NSMutableArray *array = [NSMutableArray arrayWithArray:@[@4,@1,@10,@5,@2,@88,@3]];
 for (int i = 0;i < array.count ; i ++) {
        for (int j = 0; j < array.count - i - 1 ; j ++) {
           //升序
            if ([array[j] integerValue] > [array[j + 1] integerValue]) {
                NSNumber *temp;
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }

C语言

折半查找:在一个有序的数组中 ,找出要查找数的下标

查找对应key的下标,找不到返回-1

//声明 函数
int findUniqueKey(int nums[], int length, int key);
    //创建有序数组
     int nums[] = {1,3,5,7,9};
    //获取到数组长度
    int length = sizeof(nums)/sizeof(nums[0]);
    //要查找的数
    int key = 7;
    //调用
    int result = findInsertIndex(nums, length, key);
    printf("下标为%i\n",result);

查找对应key的下标函数,找不到返回-1

int findUniqueKey(int nums[], int length, int key){
    //每次对比时候最小的数
    int min = 0;
   //每次对比时候最大的数
    int max = length - 1;
   //每次对比时候中间的数
    int mid = (min + max)/2;
    
    while (nums[mid] != key) {
        
        if (key > nums[mid]) {
            min = mid + 1;
       
        } else if (key < nums[mid]) {
            max = mid - 1;
        }
        
        if (min > max) {
            return -1;
        }
        
        mid = (min + max)/2;
    }
    return mid;
}

关于折半查找的面试题:将一个数插入一个有序的数组之后,还保持数组的有序性,求插入的位置(下标)

最后我们要找的是 当条件第一次不符合时候(最小值大于最大值),min的值为我们要求的值

//声明 函数
int findInsertIndex(int nums[], int length, int key);
    //创建有序数组
     int nums[] = {1,3,5,7,9};
    //获取到数组长度
    int length = sizeof(nums)/sizeof(nums[0]);
    //要插入的数
    int key = 6;
    //调用
    int result = findInsertIndex(nums, length, key);
    printf("下标为%i\n",result);
int findInsertIndex(int nums[], int length, int key) {
    
    int min,mid,max;
    min = 0;
    max = length - 1;
    mid = (min + max)/2;
    
    while(min <= max) {
        
        if (key < nums[mid]) {
           
            max = mid - 1;
       
        } else if (key > nums[mid]) {
           
            min = mid + 1;
        }
        
        mid = (min + max)/2;
    }
    
    return min;
    
}

上一篇 下一篇

猜你喜欢

热点阅读