数据结构-八大排序

选择排序:找到待排序数组当中的最小值,然后将其和待排序数组的首位进行交换

插入排序:将待排序数组当中的值插入到已经拍好序的数组当中,假设数组的第一个数据是已经排好序的,必须有这个假设

在这个过程中就是跟前面比较向前交换

插入排序过程中,如果后面的数据比较小,前边的数据比较大,那么就可能会导致小数据向前移动的次数比较多,进而将整个算法的效率降低。

希尔排序==缩小增量排序

希尔排序:要求两两进行分组,间隔是数组的一半,偶数是两两分组,奇数的话把中间留出来就行

5和0是一组 7和3是一组 4和1是一组

然后0和5比较,0

一开始是两两分成一组,交换完后,现在是四四分成一组,同样在组内进行对比排序

然后在八八一组,最后进行插入排序

总结:感觉希尔排序是插入排序的优化

基数排序:思想来源于桶 首先先把个位数一样的都放到一个桶里

然后再排十位数字

然后再把数字依次取出来

再排百位数字

快速排序:(是经常用的一种排序方式)第一步,假设将待排序数组当中的第一个数字作为基准数,把35作为基准数,第二步,定义i和j游标,分别指向待排序数组的第一位和最后一位。第三步,让j游标先移动,去找比当前基准数小的数据,找到后停止。第四步,让i游标去移动,找比当前基准数大的数据,找到后停止。第五步,判断i和j游标是否相遇 5.1未相遇,i和j指向的值进行交换,然后继续进行3 4 5步 5.2当i和j游标相遇,相遇位置的数和基准数进行位置交换,现在的数中,前面的一定比基准数小后面的一定比基准数大

以基准数为界,将数组拆分成左右两部分重新执行上述步骤

一直拆分,当每一个元素拆分成单个元素的时候就有序了,那么快速排序就完成了

快速排序的时间复杂度:第一轮执行了n次 第二轮执行了n-1次 第三轮执行了n-3次 第y轮执行

第一轮1个数据有序 第二轮2个数据有序 第三轮4个数据有序

所以y和n的关系为y=logn,但是每轮执行n次

时间复杂度:数据个数y和数据总量x之间的关系y=ax+b y=ax^2 y=a x=a^y

冒泡排序:定义一个i游标和一个i+1游标进行交换就可以了

数组叫做arr,交换东西一定需要一个临时空间,j相当于所交换的轮数

for(int j=0;j<arr.length;j++){ for(int i=0;i<arr.length-1;i++){ if(arr[i]>arr[i+1]){ int temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } }

递归算法

1.确定递归函数的参数和返回值,以及返回值类型(变量有哪些参数就有哪些)

2.找到递归的终止条件

3.递归的逻辑(f(n)=f(n-1)+f(n-2))递归逻辑让考虑什么就直接去考虑什么

问题:一只青蛙一次可以跳1级台阶,也可以跳2级。求该青蛙跳上一个n级的台阶总共有多少种跳法

第n层台阶一定是从n-1级台阶或者n-2级台阶跳上去的。

首先思考递归的逻辑:思考n-1台阶几种跳法,n-2几种跳法.....1个台阶一种跳法,n种台阶前面

public static int sum(int n){ if(n==1){ return 1; } return sum(n-1)+sum(n-2); }

问题:实现从1加到n用递归实现

定义数组:求数组的前n项和

猴子吃桃子问题:

求什么设置什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值