选择排序:找到待排序数组当中的最小值,然后将其和待排序数组的首位进行交换
插入排序:将待排序数组当中的值插入到已经拍好序的数组当中,假设数组的第一个数据是已经排好序的,必须有这个假设
在这个过程中就是跟前面比较向前交换
插入排序过程中,如果后面的数据比较小,前边的数据比较大,那么就可能会导致小数据向前移动的次数比较多,进而将整个算法的效率降低。
希尔排序==缩小增量排序
希尔排序:要求两两进行分组,间隔是数组的一半,偶数是两两分组,奇数的话把中间留出来就行
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项和
猴子吃桃子问题:
求什么设置什么