2024.6.6學習java&演算法

vast_joy發表於2024-06-09

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];
  }
}

相關文章