2024.6.6学习java&算法

java---
对象赋值:
新建类class person包含String name和int age两个属性
在main方法中new person xiaoming,name为"xiaoming",age为19。
new person tiedan,tiedan=xiaoming。
输出tiedan的属性得到"xiaoming,19"
tiedan.name="tiedan"
输出xiaoming的属性得到"tiedan,19"
解释:tiedan和xiaoming两个对象在main的栈帧中储存的是两个地址,指向堆中new出的一片内存,在堆中储存着对象的属性。
tiedan=xiaoming这个语句相当于将xiaoming指向的地址赋值给了tiedan,二者指向同一地址(相当于数组赋值,实际是引用)由此,由于tiedan和xiaoming均指向一个地址,修改tiedan.name后再输出xiaoming.name发现也被修改了。

算法---
1.洛谷P1177 【模板】排序:
将读入的 N 个数从小到大排序后输出。
输入样例:
5
4 2 4 5 1
输出样例:
1 2 4 4 5

解答:
使用stl中的sort函数,读入数据储存在int ans[100010],sort(ans,ans+N)
我们设我们排序的数组为 a,排序区间为 [l,r),且从小到大排序。则调用方法为:
sort(a + l, a + r);
如果想改变排序顺序,重载cmp函数即可
bool cmp(int a,int b){
return a>b;
}(大于号就是从大到小,小于号就是默认,从小到大)
快排复杂度

2.洛谷P1923 【深基9.例4】求第 k 小的数:
输入样例:
5 1
4 3 2 1 5
输出样例:
2

解答:
数据范围是n<5000000,利用快排算法的二分属性,可以在时间复杂度O(nlogn)下实现
int x[5000100]储存输入数据,找第k小

void qsort(int l,int r){ 
  int i=l,j=r,mid=x[(l+r)/2];
  do{
    while(x[j]>mid) j--;
    while(x[i]<mid) i++;
    if(i<=j){
    swap(x[i],x[j]);
    i++;
    j--;
    }
  }
  while(i<=j);//至此数组被划分为l<=j<=i<=r
  if(k<=j) qsort(l,j);
  else if(k>=i) qsort(i,r);
  else {
  cout>>x[j+1];
  }
}
posted @ 2024-06-09 01:09  vast_joy  阅读(15)  评论(0编辑  收藏  举报