算法讲解--选择排序、数组链表

算法讲解--选择排序、数组链表


本文是对《算法图解》的第二章的学习的笔记。欢迎多多指正。

数组和链表

数组:
   
使用数组存储item意味着所有item在内存中都是相连的。在数组中存储新的item可能很麻烦,because if 没有了新空间,就得移动到内存的其他地方,因此添加新元素会很慢。数组删除元素也很麻烦,删除元素后,必须将后面的元素前移。
结决办法1 :预留空间。
缺点:
1、额外请求的位置可能用不上。这将会浪费内存。【占着**不拉*】相信你能猜测到啥意思 xixi
2、if 预留空间还不够,还是得转移。
结决办法2 :使用链表

链表:
   
链表中的元素可存储在内存中的任何地方。链表中的每个元素都存储了下一个元素的地址,从而使一系列随机内存地址串在一起。 使用链表添加元素很容易,只需将其放入内存,并将地址存储到前一个元素中就ok了,注意:使用链表不需要移动元素。删除操作:链表也是更好的选择,because 删除元素只需修改前一个元素指向的地址即可。

总结:
   
       数组读取的运行时间 O(1) 插入O(n) 删除 O(n)
       链表读取的运行时间 O(n) 插入O(1) 删除 O(1)
注意下哈。。。 再同一个数组中,所有元素的类型都必须相同(都为int 、double等) 弊端 引出集合

选择排序

example: 找出播放次数组多的乐队,必须检查列表中的每个元素。需要的时间O(n),对于这种O(n)的操作,需要执行n次。需要的总时间即 O(n2)

下面展示一些 内联代码片

   public int[] sort(int[] sourceArray) {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 总共要经过 N-1 轮比较,每一次找到最小的索引值
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;

            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }

            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }

        }
        return arr;
   }

猜你喜欢

转载自blog.csdn.net/l1996729/article/details/106504207
今日推荐