今天开始,我就把自己学习的过程记录下来,避免自己学了之后就忘记了,让自己能够坚持下去,希望会有所收获。
数据结构,包含两个方面:
逻辑结构:集合结构,线性结构,树形结构,图标结构。
存储结构:表,堆栈,队列,数组,树,二叉树,图。二叉树和图我还不知道怎么回事,以后学了在总结。
我好像总结完事了,但是好像什么也没说似的,看来要经常写才行,语言组织的不好。
算法:
要完成一个功能,你是怎么做到的,你的思路就是算法。
衡量的几个标准
空间复杂度:代码行数
时间复杂度:排序的个数n,以及for循环,数据交换。执行的效率
O(n):
O(n)=n²+n+100 =>n²
O(n)=n³+n²+n=>n³
应用场景:这个也是比较重要的,比方说10个整数的数组使用Arrays.sort(array)进行排序,就不太妥当,里面实现的空间复杂度太大,100多行的代码,就排序10个数这不一定是最好的。应该使用冒泡或者是选择排序。
冒泡排序:
思想:1.如同烧开水,水泡向上咕噜咕噜越来越大。每次比较相邻的两个数据,将大的向后靠。
代码如下:
for(int I = 0;i<array.length-1;i++){
if (array[i] > array[i+ 1]) {
swap(I,i+1);
}
}
2.这样循环一次之后,最大的数就到了数组的最后了。
将这样的操作执行array.length-1次,就冒泡结束了。
for(int j=array.length-1;j>0;j--){
for(int I = 0;i<j;i++){
if (array[i] > array[i+ 1]) {
swap(I,i+1);
}
}
}
时间复杂度:第一次需要n-1个数比较,第二次需要n-2次比较,最后两个数比较1次就好了
O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2
这样冒泡就OK了,也是可以做个优化的,可以在if里面做判断,如果没有可以交换的数据,可以提前退出外层for循环。
选择排序:
思路:
1.第一个数作为参考点,假设是最小的数据。在剩下的数据中遍历出来最小的数据,如果比第一个还小,那就和第一个数据进行交换位置。
int index = 0;//参考点
for(int I=index + 1;i<array.length-1;i++){
if(array[I]<array[index]){
index = I;
}
}
swap(index,0);
这样,经过一次的选择排序,就会有一个最小的数据被选出来,放到了参考点的问题位置。
2.将参考点向后移动,在进行array.length-1次选择。
for(int j = 0; j < array.length-1;j++){
int index = j;
for(int I=index + 1;i<array.length-1;i++){
if(array[I]<array[index]){
index = I;
}
}
swap(index,j);//j 是参考点,index是遍历出来后的最小的元素,将他们互换。
}
时间复杂度:
第一个参考点需要比对n-1次,第二个参考点需要比对n-2次,......比对1次
O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2
冒泡和选择的区别:
冒泡:相邻的两个数据交换的次数比较频繁,但是可以提前退出外循环。
选择:比较两个两个数的大小次数多,但是数据交换的次数少,最坏的情况是要进行n-1次交换。
这两种排序通常使用在10个数据以内的排序,性能没什么差异。但是数据量超过10个,考虑其他排序方式。
网友评论