美文网首页简单算法
冒泡排序、选择排序、折半查找

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

作者: Persistent丧心病狂 | 来源:发表于2018-12-15 00:02 被阅读3次

    简单的算法

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

    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;
        
    }
    
    

    相关文章

      网友评论

        本文标题:冒泡排序、选择排序、折半查找

        本文链接:https://www.haomeiwen.com/subject/ogxohqtx.html