第1节 位运算、算法是什么、简单排序

##这是数据结构与算法新手班-左程云第一节课的笔记##

1. 位运算

// 你们会不会表示一个数字的32位啊?
// Java中int类型默认以32位二进制数在计算机内存储,只是用十进制给你显示出来(先用这个例子让你知道什么是位运算,什么是左移、右移运算符)
public class Test {public static void print(int number){for(int index = 31;index >= 0;index--){// &:有0则0 // |:有1则1 // ^:相同则0,不同则1 // ~:否// << 左移运算符:右边用0来补,左移1位相当于×2// >> 右移运算符:左边用0来补,右移1位相当于÷2System.out.print( (number & ( 1 << index)) == 0 ? "0":"1");}System.out.println();}public static void main(String[] args){// 假设数字为100int number = 100;print(number);}
}
// 这个代码就给你留在这里了,位运算在后面展开吧…接下来讲一下负数是怎么表示的?反码啊、补码啊这些....
// int的范围理应是0-2^32-1,然而我们去编译器里面打印下最大值,结果是21亿多,怎么少一半呢?
int a = Integer.MAX_VALUE;
System.out.println(a);
// out:2147483647
// 那他的二进制是什么样呢?正好有这个函数,我们看一下
System.out.print(a);
// out:01111111 11111111 11111111 11111111
// 哦!会发现最高位是0,这个是符号位,最左侧的位用1表示负数。所以JAVA中int的范围为-2^31~2^31-1,加起来总共2^32个数字,0开头的有2^31个(包括0自己),1开头的也有2^31个。// 负数的二进制怎么表达呢?11111111 11111111 11111111 11111111:表示-1,符号位不管,其它部分按位取反再加1
int b = Integer.MIN_VALUE;
System.out.print(b);
// out:10000000 00000000 00000000 00000000,按位取反再加1,表示-2^31,,它的目标是二进制位->十进制位,先看符号位是多少,如果是1,就把负号写上,然后把符号位后面的按位取反再加1,按照32位存储,把得出来的正数直接放在符号的后面// 那么为毛负数就是按位取反再加1呢?今天我不可能展开,但原理是这样的!
// 在计算机内,所有的算数符号底层都是用位运算符来实现的,比如a+b,如果a、b都是正数,有一套运算逻辑,但是a为负数呢?这套逻辑不符合了怎么办?再给它开辟一个新的逻辑?那么这么多算数符号,要开辟这么多逻辑吗?太麻烦了!想象能不能把负数也采用正数的逻辑?这个规则的作用就是解决这个问题的!
// 突然想到一个事,>>和>>>的区别?
// >> 右移运算符:这个是用符号位来补。例如:1024是用0来补左侧,-22是用1来补左侧。而>>>是不用符号位补,即默认用0补。// 再者:相反数怎么写?
int c = 5;
int d = -c;
System.out.print(d);
d = (~c + 1);
System.out.print(d);
// 这里的~不管是不是符号位,都取反,它的目标是二进制位->二进制位
// 00000000 00000000 00000000 00000101 原c
// 11111111 11111111 11111111 11111011 取反加1,为-5
// 这个不管正负,都可以使用这个逻辑。
// 00000000 00000000 00000000 00000101 再取反加1,为5,回去了,测试成功!
// 正数比负数表示少一位,每一个正数都有对应的负数,那么最小那个数取相反是多少?好问题!答案是还是本身!
// 10000000 00000000 00000000 00000000 最小数字表达
// 01111111 11111111 11111111 11111111 + 00000000 00000000 00000000 00000001 按位取反再加1
// 10000000 00000000 00000000 00000000 回去了,还是最小数字
// 0的相反数是多少?
// 00000000 00000000 00000000 00000000
// 11111111 11111111 11111111 11111111 + 00000000 00000000 00000000 00000001 按位取反再加1
// 00000000 00000000 00000000 00000000 溢出了!还是其本身

3. 什么是算法?

  • 有具体的问题(要解决的问题)
  • 有涉及解决这个问题的具体流程(算法/方法)
  • 有评价处理流程的可量化指标(你可以设计流程,我也可以设计流程,肯定有个好中差,怎么评价呢?得用指标呀!)

4. 算法的分类?

  • 分类当然非常多,但大体而言就分为两类
  • 对于新手学习特别重要的一个分类:1.第一类:明确知道怎么算的流程(就是白话文吧,直接写出来的那种);2.第二类:明确知道怎么尝试的流程(比如一个数的所有因子没给出来,但是我可以算出来)

5. 题目之n的阶乘之和→也算是对可量化指标的解释吧!

/*题目一:给出一个数字N,求出1!+2!+....N!*/
class Test{// 小A同学的做法,用了两个方法public static int factor(int number){int result = 1;for(int index = 1;index <= number;index++){result *= index;}return result;}public static int fun1(int N){int sum = 0;for(int index = 1;index <= N;index++){sum += factor(index);}return sum;}// 小B同学public static int fun2(int N){int sum = 0;int cur = 1;for(int index = 1;index <= N;index++){cur = cur * index;sum += cur;}return sum;}public static void main(String[] args){// 写的真恶心System.out.println(fun1(10));// 这个还可以System.out.println(fun2(10));}
}

5. 题目之简单排序:选择、冒泡、插入+插入优化

/*题目二:选择排序,思想很重要:每一轮把这一轮的最小值放在第一个位置,直至N轮完成后,序列自动归位*/
class Test{// 选择排序public static void selectSort(int[] arr){// 先想边界条件if(arr == null || arr.length < 2){return;}// 0 ~ n-1,将最小值放在0位置// 1 ~ n-1,将最小值放在1位置// 2 ~ n-1,将最小值放在2位置// ...// n-2 ~ n-1,将最小值放在n-2位置for(int i = 0;i < arr.length-1;i++){// 定义最小值的位置int minValueIndex = i;for(int j = i + 1;j < arr.length;j++){// 这是我的写法if(arr[minValueIndex] > arr[j]){minValueIndex = j;}// 这是老师的写法// minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;**}// 交换int temp = arr[minValueIndex];arr[minValueIndex] = arr[i];arr[i] = temp;}}public static void main(String[] args){int[] arr = {1,54,21,45,2,44};selectSort(arr);for (int i : arr) {System.out.print(i + " ");}}
}
/*题目三:冒泡排序,思想很重要:每一轮把最大的值往后放,大泡泡先上去*/
// 总结:冒泡是大往后,选择是小往前
class Test{// 冒泡排序public static void bubbleSort(int[] arr){// 先想边界条件if(arr == null || arr.length < 2){return;}// 0 ~ n-1 区间干一坨事情// 0 ~ n-2 区间干一坨事情// 0 ~ n-3 区间干一坨事情// ...     区间干一坨事情// 0 ~ 1   区间干一坨事情// 这里就用end表示后边的变量for(int end = arr.length-1;end > 0;end--){// 后面的确定好了就不需要考虑了,所以你后面就要-i,然后判断里面写的是arr[j+1]和arr[j]判断,所以还需要额外-1,否则会溢出for(int first = 0;first < end;first++){// 这是我的写法if(arr[first+1] < arr[first]){// 交换int temp = arr[first+1];arr[first+1] = arr[first];arr[first] = temp;}}}}public static void main(String[] args){int[] arr = {1,54,21,45,2,44};bubbleSort(arr);for (int i : arr) {System.out.print(i + " ");}}
}
/*题目四:插入排序,思想很重要:间断区间有序,类似与打斗地主*/
class Test{// 插入排序public static void insertSort(int[] arr){// 先想边界条件if(arr == null || arr.length < 2){return;}// 0-1 区间有序// 0-2 区间有序// 0-3 区间有序// .....// 0-n-1 区间有序for(int end = 1;end < arr.length;j++){// 怎么实现区间内有序呢?int newNumIndex = end;while(newNumIndex - 1 >= 0 && arr[newNumIndex -1] > arr[newNumIndex]){// 交换int temp = arr[newNumIndex];arr[newNumIndex] = arr[newNumIndex-1];arr[newNumIndex-1] = temp;newNumIndex--;}/* 这是我实现的,其实一模一样// 怎么实现区间内有序呢?for(int newNumIndex = end;newNumIndex > 0;newNumIndex--){// 现在进到区间里面了,开始判断if(arr[end-1] > arr[newNumIndex]){// 交换int temp = arr[newNumIndex];arr[newNumIndex] = arr[newNumIndex-1];arr[newNumIndex-1] = temp;}}*/}}public static void main(String[] args){int[] arr = {1,54,21,45,2,44};insertSort(arr);for (int i : arr) {System.out.print(i + " ");}}
}
/*题目四:插入排序,那我们可以再优化上一个版本*/
// 咦~他的优化版本和我上面注释的自己写的部分几乎一样!那我这里就不写了....
class Test{// 插入排序public static void insertSort(int[] arr){// 先想边界条件if(arr == null || arr.length < 2){return;}// 0-1 区间有序// 0-2 区间有序// 0-3 区间有序// .....// 0-n-1 区间有序for(int end = 1;end < arr.length;j++){for(int newNumIndex = end;newNumIndex > 0;newNumIndex--){// 现在进到区间里面了,开始判断if(arr[end-1] > arr[newNumIndex]){// 交换int temp = arr[newNumIndex];arr[newNumIndex] = arr[newNumIndex-1];arr[newNumIndex-1] = temp;}}}}public static void main(String[] args){int[] arr = {1,54,21,45,2,44};insertSort(arr);for (int i : arr) {System.out.print(i + " ");}}
}

数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)相关推荐

  1. 数据结构与算法JC班-左程云第一节课笔记(认识复杂度、对数器、二分法与异或运算)

    第1节 认识复杂度.对数器.二分法与异或运算 程序=算法+数据结构,既然算法这么重要,每个人写出来的算法又不一样,那么怎么算是一个好的算法呢? 1.评估算法优劣的核心指标是什么? 时间复杂度(流程决定 ...

  2. 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)

    第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...

  3. 左程云:程序员该如何学习算法?

    大家好,我是左程云.我本科就读于华中科技大学.硕士毕业于在芝加哥大学.先后在IBM.百度.GrowingIO和亚马逊工作,是一个刷题7年的算法爱好者. 我是<程序员代码面试指南--IT名企算法与 ...

  4. 算法与数据结构全阶班-左程云版(二)基础阶段之3.归并排序和快速排序

    文章目录 前言 1.归并排序 2.快速排序 总结 前言 本文主要介绍了两种排序,归并排序和快速排序,归并排序有递归和非递归2种方式实现,快速排序的升级版为荷兰国旗问题. 1.归并排序 归并排序: 1) ...

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

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

  6. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  7. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

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

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

  9. 【左程云Java算法】Chapter1-5:用一个栈实现另一个栈的排序

    [左程云Java算法]Chapter1-5:用一个栈实现另一个栈的排序 [题目] 用一个栈实现另一个栈的排序 [要求] 一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个 ...

最新文章

  1. 2018-3-28 基本粒子群优化算法
  2. 电路交换-报文交换-分组交换- 分组交换包括:虚电路和数据报
  3. 后端常用开源组件合集(持续更新中)
  4. python 密度 语音_Python+sklearn机器学习应该了解的33个基本概念
  5. 删除安装的mysql数据库文件_安装/删除MySQL数据库
  6. 兰州大学第一届『飞马杯』程序设计竞赛 - ★★平形四边行★★(鸽巢原理+暴力)
  7. 使用SQL Server连接xml接口,读取并解析数据
  8. 8-16 常见开发运维问题
  9. KMP算法(C语言版)
  10. 使用nohup让程序在远程主机后台运行
  11. 生产环境 JDK6 升级 JDK8
  12. 【供应链架构day5】美团供应链架构的演进之道 - 团购时代
  13. SiteApp转码声明 来自百度
  14. windows和linux双系统
  15. 2008年SP产业发展趋势
  16. 辐射探测 期末考试 考完后的recheck!oh,老baby,高纯锗要低温呀!!
  17. JS_SDK实现网站应用QQ登录功能-QQ互联(小白易懂)
  18. uni-app中接入友盟统计
  19. Android最新版支付宝钱包的实例源码
  20. Ansible 实战案例--Ansible Ad-Hoc 组件详解

热门文章

  1. photoshop9.0 中文免费版
  2. libhdfs 的C API
  3. MATLAB顺序结构及选择结构程序设计
  4. 【python】待君有余暇,看春赏樱花,这不得来一场浪漫的樱花旅~
  5. fusionsphere环境搭建_fusioncompute 环境搭建
  6. 战国策-周文君免工师籍
  7. 两个求和符号,Matlab写法
  8. ubuntu窗口关闭按钮设置左右位置
  9. MFC自定义右上角关闭按钮功能
  10. WebWorker进阶