排序算法1:插入排序

基础知识:

核心:遍历扫描数组,将每一步所得的最小值放入相应的位置。

****:对于同样时间复杂度的算法,比较其速度,执行代码比较时间即可。

时间复杂度:

空间复杂度:

****:空间复杂度

解释:若出执行算法时,需要另外开辟与原数组等规模的空间。

代码实现:

Java实现:

public static int[] sort(int[] ins){for(int i=1; i<ins.length; i++){for(int j=i; j>0; j--){if(ins[j]<ins[j-1]){int temp = ins[j-1];ins[j-1] = ins[j];ins[j] = temp;}}}return ins;
}

C实现:

void insertionSort(int data[], int size) {int i, j, key;for (i = 1; i <= size - 1; i++) {key = data[i];j = i;while (data[j-1] > key && j >= 1) {data[j] = data[j-1];j--;}data[j] = key;}
}

算法练习1:异或运算

基础知识:

性质1:0与任何数异或,仍是该数本身。

性质2:任何一个数与自身异或,结果为0。

性质3:异或满足交换律与结合律。

代码实现:

使用异或实现swap函数:

//使用异或实现swap函数
//需保证a与b不指向同一块内存地址
public static void swap (int a,int b){a = a^b;b = a^b;a = a^b;
}

相关算法问题及代码实现:

异或问题1:一堆数中,只有一个数出现了奇数次,其余均出现了偶数次,如何找出该数?

解题思路:将所有的数进行异或操作,出现偶数次的数经过异或操作后必定为0,最终的异或结果为出现奇数次的数

代码实现:

/*一堆数中,只有一个数出现了奇数次,
**其余均出现了偶数次,如何找出该数?*/
public static void printOddTimesNum1(int[] arr){int eor = 0;for(int cur : arr)eor ^= cur;system.out.println(eor);
}

异或问题2:若有两个数出现奇数次,该如何求解?

解题思路:仿照问题1,将所有数进行异或操作,最终eor中保留的变量结果为两个出现奇数次数的异或结果.由于两个数必定不相同,则根据eor中的某位不为0的数为基准,继续进行异或操作.此时可以获得其中一个出现奇数次的数eor2,最后再将eor与eor2异或,得到第二位奇数次的数.

public static void printOddTimesNum2(int[] arr){int eor = 0;for(int curNum : arr)eor ^= curNum;//eor必定不为0int eor2 = 0;//找到eor中最右边不为0的数int rightOne = eor & (~eor + 1);//以该位为标准,继续异或整个数组for (int cur:arr)if ((cur & rightOne) == 0)eor2 ^= cur;System.out.println(eor2 + " " + eor^eor2);}

二分法的详解与扩展:

问题1:在一个有序数组中,找某个数是否存在。

//算法第四版p15
//rank函数的一个借口,Java中的方法重载
public static int rank(int key, int[] a)
{return rank(key, a, 0, a.length - 1);
}
//二分查找的递归实现
public static int rank(int key, a, int lo, int hi)
{if(lo > hi)return -1;int mid = lo + (hi - lo) / 2;//防止溢出//位运算速度更快//int mid = lo + ((hi - lo)>>1);if (key < a[mid])return rank(key, a, lo, mid - 1);else if (key > a[mid])return rank(key, a, mid + 1, hi);elsereturn mid;
}

问题2:在某个数组中,找>=某个数最左侧的位置。

待更新

问题3:局部最小值问题。

待更新

测试方法:对数器方法(在无OJ的情况下,可以测试代码正确性)

对数器的概念和使用
0,有一个你想要测的方法a,
1,实现一个绝对正确但是复杂度不好的方法b,
2,实现一个随机样本产生器
3,实现比对的方法
4,把方法a和方法b比对很多次来验证方法a是否正确。
5,如果有一个样本使得比对出错,打印样本分析是哪个方法出错,当样本数量很多时比对测试依然正确,可以确定方法a已经正确。
————————————————
版权声明:本文为CSDN博主「qxlxi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jia970426/article/details/105057929

1.有一个你想要测的方法a,测试一个选择排序

//选择排序
public static int[] sort(int[] ins){for(int i=1; i<ins.length; i++){for(int j=i; j>0; j--){if(ins[j]<ins[j-1]){int temp = ins[j-1];ins[j-1] = ins[j];ins[j] = temp;}}}return ins;
}

2. 实现一个绝对正确但是复杂度不好的方法b, 调用系统的排序

此方法核心要保证绝对正确,时间复杂度无需考虑

 /**** 2. 实现一个绝对正确的但是复杂度不好的方法b*  调用系统中的排序算法Arrays.sort 排序*/public static void  comparator(int [] arr){Arrays.sort(arr);}

3.★★★实现一个随机样本产生器

//产生随机数组
public static int[] generateRandomArray(int maxSize, int maxValue){//Math.random -> 等概率产生并返回一个[0,1)上所有的小数//Math.random() * N -> 所有小数,等概率返回一个//(int)(Math.random() * N) -> [0,N-1]上所有的整数,等概率返回一个int[] arr = new int[(int)((maxSize + 1) * Math.random())];//数组长度随机for (int i = 0;i < arr.length;i++){arr[i] = (int)((maxValue + 1) * Math.random()) - (int)(maxValue * Math.random());}return arr;
}

4.实现比对的方法

//测试,复制一个新数组,避免污染原数组
public static int[] copyArray(int[] arr){if (arr == null){return null;}int[] res = new int[arr.length];for (int i = 0;i < arr.length;i++)res[i] = cur[i];return res;
}
//for test
public static boolean isEqual(int[] arr1, int[] arr2){if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null))return false;if (arr1 == null && arr2 == null)return  true;if (arr1.length != arr2.length)return false;for (int i = 0; i < arr1.length;i++)if (arr1 != arr2)return false;return true;
}

左程云算法课堂笔记(初级1)相关推荐

  1. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

  2. B站左程云算法视频笔记(01

    1.位运算 异或 ^ ,可理解为不进为相加,满足结合律和交换律 a^a=0: a^0=a: 交换a和b a=a^b: b=a^b: a=a^b: 但必须满足是位置不同的(同一内存位置自己异或结果为0) ...

  3. 左程云算法课笔记(1)

    认识时间复杂度--常数时间操作 老师在这里拿数组和链表举例何为常数操作: 数组是一块连续的内存空间,当我们要访问数组中的某个元素时,我们可以算距离,怼偏移量,直接把这个数据拿出来,和样本的数据量,即数 ...

  4. B站左程云算法视频笔记05

    大数据 有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL (布隆过滤器或者哈希函数分流) [补充]某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种 ...

  5. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  6. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  7. CSDN专访左程云,算法之道

    算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...

  8. 左程云算法笔记总结-基础提升篇

    提升01(哈希) 认识哈希函数 哈希函数的输入一般需要是无穷尽的,没有限制:输出可以有一定的范围,比如MD5加密后产生的字符串可以有2的32次方-1种,用十六进制表示需要16个字符. 相同的输入对应相 ...

  9. 左程云算法 - 公开课笔记

    第五节 题目:原地交换,不允许额外的空间 方法1:复杂度O(N/2) 1.左侧逆序 2.右侧逆序 3.整体逆序 方法2:循环右移 复杂度O(N^2) 方法3: 直到左右等长的时候,就不再交换了 第六节 ...

  10. 左程云算法课—02课程笔记

    目录 一.剖析递归行为和递归行为时间复杂度的估算 master公式的使用(满足子问题等规模) 二.归并排序 归并排序的扩展 小和问题 逆序对问题 三.荷兰国旗问题 问题一 问题二 四.快速排序 不改进 ...

最新文章

  1. react native的学习
  2. [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)
  3. php 基础 判断类型
  4. 0005-Longest Palindromic Substring(最长回文子串)
  5. 待字闺中:日志查询。(网络摘要)
  6. 深度学习(四十二)word2vec词向量学习笔记
  7. 《构建之法》 第5.5 第6 第7章
  8. windbg分析Kernel32.dll导出表
  9. html读取在线文件,javascript中如何读取文件?
  10. no module named pytz(pycharm)
  11. html5经纬度定位 源码_HTML5获取地理经纬度并通过百度接口得到实时位置
  12. oracle 12c ora 01033,ORA-01033: ORACLE initialization or shutdown in progress(12c中)
  13. c1侧方停车技巧图解解析停车要点
  14. IIS本地FTP服务器搭建
  15. 目前世界最穷的国家是哪一个?
  16. unity学习笔记-换装系统
  17. python列表两两相减_【数据分析入门】之:如何用Python代替Excel(1)
  18. docker基本操作小结
  19. AutoCAD 删除集合对象中的成员
  20. QFontMetrics

热门文章

  1. opencv 运动检测 三帧差法
  2. uniapp -nvue 轮播图与背景图的淡入淡出效果
  3. 高通平台抓取ramdump并用qcap解析
  4. iPad被停用,安装iTunes提示安装包出错解决办法
  5. 学习单片机系列(一)单片机选型
  6. 深度学习系列资料总结
  7. 弹性地基梁板法计算原理_基础专题
  8. 前端开发应知网站(强烈推荐!)
  9. android tts 音量,Android TTS音量控制
  10. RSPAN-华为二层(s2000 HI)