一、认识复杂度及简单排序算法
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.对数器
验证写的算法对不对用的
一、认识复杂度及简单排序算法相关推荐
- 认识复杂度和简单排序算法
认识复杂度和简单排序算法 常数时间操作 int a =arr[i]; 是一个常数操作 int b=list.get(i); 不是一个常数操作,为了得到b的值只能从左到右进行遍历,逻辑上是一个线性表示, ...
- 算法:三种简单排序算法
排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...
- python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现
写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...
- 简单排序算法(Java实现)
简单排序算法:冒泡排序,选择排序,插入排序 一.冒泡排序 1.1 原理: 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置 指针由第一个数据移向第二个数据,第二 ...
- 简单排序算法设计(Java)
总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){for(int i=0;i ...
- 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序
[简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
- 数组专题讲义之简单排序算法
专题二 简单排序算法 阅读代码,回答下列问题: #include <iostream> using namespace std;const int M = 100; const int N ...
- 算法复杂度简介以及排序算法简介
目录 一.算法复杂度 时间复杂度: 1.时间频度可能不同,但是时间复杂度可能相同: 2.时间复杂度计算规则: 3.常见的时间复杂度场景: 空间复杂度: 十大排序算法: 1.冒泡: 2.选择: 3.插入 ...
最新文章
- 新建文件夹html文件,JS实现新建文件夹功能
- 移动自动化测试:appium的用法 (appium usage)
- mysql 参数 innodb_flush_log_at_trx_commit
- K3-openwrt交换机模式-挂载磁盘-部署kodexplorer可道云私有云盘-极简单版
- RuoYi-Vue前后端分离
- python_csv文件写入
- java 实现word文档的在线签批圈阅(手写批注)
- Win10(家庭版)虚拟机安装
- 安卓APP注册登录+Tomcat服务器搭建+MySQL数据库建立+加密传输+servlet后端内容编写及部署到Tomcat服务器
- SAP ABAP EXCEL导出多个SHEET页签
- Xshell6和Xftp6 破解免安装版,无窗口多开限制
- 开发框架-.Net:Learun(力软敏捷开发)
- loadrunner 12 操作教程报告
- 2021年高处安装、维护、拆除考试试卷及高处安装、维护、拆除证考试
- Android面试题集1
- 深度解析Linux通过日志反查入侵
- 操作系统学习笔记-虚拟内存
- 大众点评的大数据实践
- 双向 DC-DC 变换器(A 题 本科组)-- 2015 年全国大学生电子设计竞赛试题
- 市场调研计划书如何写?
热门文章
- CUDA各版本之间的区别
- TigerVNC实现GNOME全功能远程虚拟桌面
- requestmapping配置页面后_Spring MVC 入门指南(二):@RequestMapping用法详解
- 关于python manage.py migrate报错的解决方法
- 91期百淘感想-创世记
- python代码写父亲节快乐_父爱如山,深情似海——你的代码像诗一样
- VS2019+Fortran语言配置
- webView.clearHistory()清空历史记录
- HiGig/HiGig+/HiGig2简介
- PowerDesigne导入Oracle,注释文字的导入