1.复杂度

看视频

2.选择排序

O(n^2) O(1)

第一步:确定范围
第二步:找到范围里的最小值并和范围内最左侧数字交换

public static void selectionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}// 0 ~ N-1  找到最小值,在哪,放到0位置上// 1 ~ n-1  找到最小值,在哪,放到1 位置上// 2 ~ n-1  找到最小值,在哪,放到2 位置上for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) { // i ~ N-1 上找最小值的下标 minIndex = arr[j] < arr[minIndex] ? j : minIndex;}swap(arr, i, minIndex);}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}

3.冒泡排序

O(n^2) O(1)

与下一个位置上的数比较,谁大谁往右移动,每一次都能确定范围上的最大值(也就是最右端的数字)

所以

第一步:确定范围

第二步:与下一个位置上的数比较,谁大谁往右移动

 public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) {return;}// 0 ~ N-1// 0 ~ N-2// 0 ~ N-3for (int e = arr.length - 1; e > 0; e--) { // 0 ~ efor (int i = 0; i < e; i++) {if (arr[i] > arr[i + 1]) {swap(arr, i, i + 1);}}}}// 交换arr的i和j位置上的值public static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}

4.异或(^)

理解:无进位相加

性质:0^N = N    N^N = 0   交换律  结合律

两个数交换可写成上面代码的异或形式,不懂看视频。

题目1:数组中有一种数出现奇数次,其他所有数都出现偶数次,如何找到出现奇数次的那一种数。

    public int fineonce(int[] nums){int eor = 0;for (int num : nums) {eor ^= num;}return eor;}

题目2:数组中有两种数出现奇数次,其他所有数都出现偶数次,如何找到这两种数。

思路:a,b表示这两个数。全部异或一遍结果一定是a^b。a,b找到一个另一个通过a^b^b(假设找到的是b)=a也能找到。所以题目转换成了如何找到ab中的一个。上一道题就是找一个,所以我们只要通过a^b的值对原数组进行分组,让a,b分别为不同的组,再去对不同的组异或,就能找到a或者b。

那么如何分组呢?

a^b的结果为1的位一定a和b不同,其余数字在这个位上一定是偶数。通过这个就可以进行分组。

    public void fineonce(int[] nums){int eor = 0;for (int num : nums) {eor ^= num;}int rightone = eor&(~eor+1);//固定代码,提取最右端的数字int res = 0;for (int num:nums){if((num&rightone)==0){res ^= num;}}System.out.println(res+" "+(res^eor));}

注:这里左神应该是讲着急了 if条件改为==1是不行的,应该改成==rightone,这里细心的弹幕已经发现了。

5.插入排序

O(n^2) O(1)

处理0-0位置的顺序,处理0-1位置上的顺序,处理0-2位置上的顺序……

特别像斗地主抓牌,你把手里的牌按顺序插入

第一步,确定0-几(范围)

第二步,在范围上排序,怎么看?往前看!

 public static void insertionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}// 不只1个数for (int i = 1; i < arr.length; i++) { // 0 ~ i 做到有序for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {swap(arr, j, j + 1);}}}// i和j是一个位置的话,会出错public static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}

插入比前两个排序好,因为插入最差是O(n)

6.二分法(查找)

O(logN)

二分查找模板

我们将区间[l,r]划分为[l,mid]和[mid+1,r]时,其更新操作是r=mid或者l=mid+1;计算mid时不用加一。

int searchRange(vector<int>& nums, int target) {int l=0,r=nums.size()-1;while(l<r){int mid=l+r>>1;if(check(mid))r=mid;else l=mid+1;}return l;
}

1)在一个有序数组中,找某个数是否存在

 public static boolean exist(int[] sortedArr, int num) {if (sortedArr == null || sortedArr.length == 0) {return false;}int L = 0;int R = sortedArr.length - 1;int mid = 0;// L..Rwhile (L < R) { // L..R 至少两个数的时候mid = L + ((R - L) >> 1);if (sortedArr[mid] == num) {return true;} else if (sortedArr[mid] > num) {R = mid - 1;} else {L = mid + 1;}}return sortedArr[L] == num;}

2)在一个有序数组中,找>=某个数最左侧的位置

    public int find(int[] nums,int target){int n = nums.length;int l = 0;int r = n-1;while(l<r){int mid = l+((r-l)>>1);if(nums[mid]>=target)r = mid;elsel = mid +1;}return l;}

3)  局部最小值(最大值)问题

力扣162. 寻找峰值(二分)_BJERGSEN97ai的博客-CSDN博客

    public int findPeakElement(int[] nums) {if (nums.length==1)return 0;int left = 0;int right = nums.length-1;while(left<right){int mid = left + (right-left)/2;if(nums[mid]>nums[mid+1]){right =mid;//将区域划分为[l,mid]  [mid+1,r]}else{left =mid +  1;}}return left;

7.对数器

验证写的算法对不对用的

一、认识复杂度及简单排序算法相关推荐

  1. 认识复杂度和简单排序算法

    认识复杂度和简单排序算法 常数时间操作 int a =arr[i]; 是一个常数操作 int b=list.get(i); 不是一个常数操作,为了得到b的值只能从左到右进行遍历,逻辑上是一个线性表示, ...

  2. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

  3. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  4. 简单排序算法(Java实现)

    简单排序算法:冒泡排序,选择排序,插入排序 一.冒泡排序 1.1 原理: 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置 指针由第一个数据移向第二个数据,第二 ...

  5. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){for(int i=0;i ...

  6. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

  7. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

  8. 数组专题讲义之简单排序算法

    专题二 简单排序算法 阅读代码,回答下列问题: #include <iostream> using namespace std;const int M = 100; const int N ...

  9. 算法复杂度简介以及排序算法简介

    目录 一.算法复杂度 时间复杂度: 1.时间频度可能不同,但是时间复杂度可能相同: 2.时间复杂度计算规则: 3.常见的时间复杂度场景: 空间复杂度: 十大排序算法: 1.冒泡: 2.选择: 3.插入 ...

最新文章

  1. 新建文件夹html文件,JS实现新建文件夹功能
  2. 移动自动化测试:appium的用法 (appium usage)
  3. mysql 参数 innodb_flush_log_at_trx_commit
  4. K3-openwrt交换机模式-挂载磁盘-部署kodexplorer可道云私有云盘-极简单版
  5. RuoYi-Vue前后端分离
  6. python_csv文件写入
  7. java 实现word文档的在线签批圈阅(手写批注)
  8. Win10(家庭版)虚拟机安装
  9. 安卓APP注册登录+Tomcat服务器搭建+MySQL数据库建立+加密传输+servlet后端内容编写及部署到Tomcat服务器
  10. SAP ABAP EXCEL导出多个SHEET页签
  11. Xshell6和Xftp6 破解免安装版,无窗口多开限制
  12. 开发框架-.Net:Learun(力软敏捷开发)
  13. loadrunner 12 操作教程报告
  14. 2021年高处安装、维护、拆除考试试卷及高处安装、维护、拆除证考试
  15. Android面试题集1
  16. 深度解析Linux通过日志反查入侵
  17. 操作系统学习笔记-虚拟内存
  18. 大众点评的大数据实践
  19. 双向 DC-DC 变换器(A 题 本科组)-- 2015 年全国大学生电子设计竞赛试题
  20. 市场调研计划书如何写?

热门文章

  1. CUDA各版本之间的区别
  2. TigerVNC实现GNOME全功能远程虚拟桌面
  3. requestmapping配置页面后_Spring MVC 入门指南(二):@RequestMapping用法详解
  4. 关于python manage.py migrate报错的解决方法
  5. 91期百淘感想-创世记
  6. python代码写父亲节快乐_父爱如山,深情似海——你的代码像诗一样
  7. VS2019+Fortran语言配置
  8. webView.clearHistory()清空历史记录
  9. HiGig/HiGig+/HiGig2简介
  10. PowerDesigne导入Oracle,注释文字的导入