android 数据结构与算法

99 阅读2分钟
* 数组:存储多个相同类型的数据的集合
 * 特点:数组中的元素可以试基本类型,也可以是引用类型
 * 数组有下标,下标从0开始计数,a[0],表示第一个元素
 * 数组在创建的时候是需要申请内存空间,而且内存空间固定,一旦数据长度超过申请的内存空间,就会导致数组的越界。
 * 数组便于更新和修改,不便于删除
 * 数组分为数值数组,字符数组,指针数组,结构体数组
 *
 * 栈:一种只能在表头插入和删除的操作的线性表,堆栈
 * 特点:按照先进后出原则存储   只能在栈顶操作
 * 栈分为顺序栈和链式栈
 *
 * 堆:用于动态分配和释放程序所使用的对象
 * 特点:堆分为最小堆和最大堆,区别在于所有父节点是否大于等于其子节点,是则最大堆,否则反之
 *
 * 队列:一种特殊的线性表,只能在队头进行删除数据操作,在队尾进行增加数据操作
 * 特点:遵循先进先出原则存储数据
 * 队列分为顺序队列,循环队列
 *
 * 链表:一种非连续,非顺序的存储方式,通过指针将数据进行连接的方式实现
 *
 *特点:在创建的时候,不需要指定长度,可以动态调整长度,不易产生越界
 * 链表的每个元素分为数组段,指针段,指针指向下一个数据的地址,从而形成串联
 * 便于增加和删除,不便于数据查询
 * 链表分为单链表,双向链表,循环链表
 *
 * 树:一个有根节点和若干个子节点的集合
 * 特点:有且仅有一个根节点
 * 子树直接不可以有交集
 * 树分为无序树,有序,二叉树
 * 树的深度值指的的是树的层次
 * 一个节点的度值得是该节点下有多少个子节点
 * 二叉树值得是每个节点的度<=2的树
 * 树的遍历分为三种:分别前序遍历(跟左右),中序遍历(左根有),后序遍历左右跟
 */
public class SunActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sun);
    }
    /**
     * 两数之和:
     *  给定一个整数数组和一个目标值,找出组中和为目标值的两个数的位置。
     *  可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
     * @return
     */
    public static int[] twoSum(int [] number, int target){
        for (int i = 0; i < number.length; i++) {
            for (int j = i + 1; j < number.length; j++) {
                if (number[i] + number[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return number;
    }

    /**
     * 插入排序算法:
     * 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即
     * [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,
     * 并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x
     * “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复
     * 杂度和空间复杂度分别为 O(n2 ) 和 O(1)。
     */
    public int [] sortInsert(int []array){
        for (int i = 1;i<array.length;i++){
            int temp = array[i];
            int j;
            for (j = i-1;j>=0&& temp<array[j];j--){
                array[j+1] = array[j];
            }
            array[j+1] = temp;
        }
        return array;
    }
    /**
     * 选择排序
     * 选择排序的基本思想是遍历数组的过程中,
     * 以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1]
     * 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会
     * 有一个选择最大值的子流程,所以人们形象地称之为选择排序。选择排序的时间复杂度和空间复杂度分别为
     * O(n2 ) 和 O(1) 。
     */
    public int [] sortSelect(int [] array){
        for (int i = 0;i<array.length;i++){
            int miniSort = i;
            for ( int m = i+1;m<array.length;m++){
                if (array[m] < array[miniSort]){
                    miniSort = m;
                }
            }
            if (array[i] > array[miniSort]){
                int temp;
                temp = array[i];
                array[i]= array[miniSort];
                array[miniSort] = temp;
            }
        }
        return array;
    }