zoukankan      html  css  js  c++  java
  • 常见的算法

    /* 快速排序

     * 升序排列

     */

    - (void)quickSortArray: (NSArray *)array withLeftIndex: (NSInteger)leftIndex andRightIndex: (NSInteger)rightIndex {

        NSMutableArray *arr = [NSMutableArray arrayWithArray:array];

        if (leftIndex >= rightIndex) {

            return;

        }

        NSInteger i = leftIndex;

        NSInteger j = rightIndex;

        NSInteger key = [arr[leftIndex] integerValue];

        while (i < j) {

            while (i < j && key >= [arr[j] integerValue]) {

                j--;

            }

            arr[i] = arr[j];

            while (i < j && key <= [arr[i] integerValue]) {

                i++;

            }

            arr[j] = arr[i];

        }

        arr[i] = @(key);

        [self quickSortArray:arr withLeftIndex:leftIndex andRightIndex:i - 1];

        [self quickSortArray:arr withLeftIndex:i + 1 andRightIndex:rightIndex];

    }

    /* 冒泡排序

     * 倒序排列 

     * 时间复杂度 O(n^2)

     */

    - (NSArray *)sortArrayWithDesc: (NSArray *)array {

        NSMutableArray *arr = [NSMutableArray arrayWithArray:array];

        for (int i = 0; i < arr.count - 1; i++) {

            for (int j = 0; j < arr.count - i - 1; j++) {

                if (arr[j] < arr[j+1]) {

                    NSNumber *temp = arr[j];

                    arr[j] = arr[j+1];

                    arr[j+1] = temp;

                }

            }

        }

        return (NSArray *)arr;

    }

    /* 选择排序

     * 升序排列 

     */

    - (NSArray *)sortArrayWithAsc: (NSArray *)array {

        NSMutableArray *arr = [NSMutableArray arrayWithArray:array];

        for (NSInteger i = 0; i < arr.count - 1; i++) {

            NSInteger index = 0;

            index = i;

            for (NSInteger j = i + 1; j < arr.count; j++) {

                if (arr[index] > arr[j]) {

                    index = j;

                }

            }

            if (index != i) {

                NSNumber *temp = arr[i];

                arr[i] = arr[index];

                arr[index] = temp;

            }

        }

        return (NSArray *)arr;

    }

    /* 从排好序的数组中去重

     * 时间复杂度O(n), 空间复杂度O(1)

     */

    - (NSInteger)removeDuplicatesFromSortedArray: (NSArray *)nums {

        if (nums.count <= 0) return 0;

        NSInteger index = 0;

        NSMutableArray *temp = [NSMutableArray arrayWithArray:nums];

        for (NSInteger i = 1; i < temp.count; i++) {

            if (temp[index] != temp[i]) {

                temp[++index] = temp[i];

            }

        }

        NSRange range = NSMakeRange(index, nums.count - index - 1);

        [temp removeObjectsInRange:range];

        NSLog(@"temp===%@", temp);

        return index + 1;

    }

    /* 从排好序的数组中去重,重复最多出现n次

     * 时间复杂度O(n), 空间复杂度O(1)

     */

    - (NSInteger)removeDuplicatesFromSortedArray: (NSArray *)nums MostDuplicatesCount: (NSInteger)times {

        if (nums.count <= times) return nums.count;

        NSInteger index = times;

        NSMutableArray *temp = [NSMutableArray arrayWithArray:nums];

        for (NSInteger i = 1; i < temp.count; i++) {

            if (temp[i] != temp[index - times]) {

                temp[index++] = temp[i];

            }

        }

        NSRange range = NSMakeRange(index, nums.count - index);

        [temp removeObjectsInRange:range];

        NSLog(@"temp===%@", temp);

        return index;

    }

    /* 数组无重复,从数组中找到target的位置

     * 时间复杂度O(log n), 空间复杂度O(1)

     */

    - (NSInteger)searchInRotatedSortedArray: (NSArray *)nums withTarget: (NSNumber *)target {

        NSInteger first = 0;

        NSInteger last = nums.count;

        while (first != last) {

            NSInteger mid = first + (last - first) / 2 ;

            if (nums[mid] == target) {

                return mid;

            }

            if (nums[first] <= nums[mid]) {

                if (nums[first] <= target && target < nums[mid]) {

                    last = mid;

                } else {

                    first = mid + 1;

                }

            }

            else {

                if (nums[mid] < target && target <= nums[last-1]) {

                    first = mid + 1;

                } else {

                    last = mid;

                }

            }

        }

        return -1;

    }

  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/wangliang2015/p/7045745.html
Copyright © 2011-2022 走看看