排序算法和扩展知识

异或运算的简单算法应用

概念:不进位相加

即相同为零,不同为一 ;0和任何数异或都等于那个数本身,

交换两个变量(不能是同一个引用地址,不然会消掉)的位置

a= 1 b=2

a=a^b

b=a^b

a=a^b

最终结果a=2 b=1

题目:

1)一个数组中一个数出现了奇数次一个数出现了偶数次

解题思路:定义一个eor1=0去异或整个数组最后留下来的那个数就是那个出现奇数次的数

2)一个数组中两个数出现了奇数次一个数出现了偶数次

解题思路://定义一个eor1=0去异或整个数组最后留下来eor就是那两个出现奇数次的数且eor不等于0

int eor1 = 0;

for(int i =0;i<arr.length;i++){

eor1 ^= arr[i];

}

//这说明eor肯定有一位不等于0,假设他是整数占四个字节即三十二位中肯定有一个不等于0

//获得不等于0的那位数

rightOne = (~eor1+1) & eor1

//再定义一个eor2去异或那个不等于0位置的那些数最后eor2得到的结果就是a or b

int eor2 = 0

for(int i =0;i<arr.length;i++){

if((cur & rightOne) == 0){

eor2 ^= arr[i];

}

}

//再用eor2^eor1得到另一个数

常用排序算法

冒泡排序

从左往右,两两相互比较大小,左边的大就交换位置,循环往复,把较大的放后面。

选择排序

是从第一个数开始,与后面所有的数相比较,找出最小的数,放在第一个位置,以此类推,每一轮确定一个相对于这一轮最小的数

插入排序

从区间最有位置向前看,如果比前面小向右移,如果不比前面小,或者前面没有数时结束循环

0-0位置有序,从0往前看

0-1位置有序,从1往前看

0-2位置有序,从2往前看

...

0-n-1位置有序,从n-1往前看

二分查找:

查找一个数存不存在,

查找<=num的最左或>=num的最右,

某个浮动区间的极值

归并排序

通俗来说就是两个有序数组,然后双指针,分别指向两个数组开头,当不越界的时候会找小的放在数组里

例:合并两个有序数组 - 提交记录 - 力扣(LeetCode)

归并排序变种,求逆序对文图

数组中的逆序对 - 数组中的逆序对 - 力扣(LeetCode)

快速排序

荷兰国旗问题

堆排序

剑指 Offer 49. 丑数 - 丑数 - 力扣(LeetCode)

计数排序

基数排序

桶排序

这种不基于比较的排序都是根据数据状况来定的

排序算法稳定性

值相同,绝对位置变后,原来的相对位置保持不变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值