① 寮鍙戜竴涓媯嬬墝綾繪父鎴廰pp澶氬皯閽
寮鍙戜竴嬈続PP鐨勪環鏍間富瑕佹槸鏍規嵁浣犳墍闇瑕佺殑鍔熻兘瀹氱殑錛屾禉奼熷ぉ灝旇蔣浠舵妧鏈鏈夐檺鍏鍙稿彲浠ョ湅澶村儚鑱旂郴錛屽湪鍗佸嚑騫寸殑寮鍙戠粡楠屼腑鎬葷粨鍑轟簡寮鍙戜竴嬈続PP闇瑕佹敞鎰忕殑浜嬮」錛屼綘鍙浠ュ弬鑰冧笅錛
寮鍙戜竴涓瀹屾暣app闇瑕佹帉鎻″摢浜涚煡璇
1銆佸墠鏈熼渶奼傝勫垝涓庝俊鎮鈥斺斾綘闇瑕佸埗瀹氬嚭涓涓瀹屾暣鐨勯渶奼傛枃妗o紝鍔熻兘鏂囨。錛屾祦紼嬪浘錛屾椂搴忓浘銆
2銆佷氦浜掕捐°乁I璁捐♀斺旇捐″嚭鍩烘湰涓斿畬鍠勭殑鍘熷瀷鍥懼拰app鍩虹鐨勪氦浜掕捐℃晥鏋滐紝涔嬪悗鍐嶆牴鎹榪欎簺璁捐″嚭瀹屾暣鐨刄I鐣岄潰騫跺︿細鍒囧浘錛屼竴浜涢渶瑕佸仛鑷閫傚簲鐨勭礌鏉愬浘鐗囬渶瑕佸仛鐐9patch銆 榪欓噷榪橀渶瑕佷綘鎳傚緱px錛宲t鍜宒p涔嬮棿鐨勬崲綆楋紝灞忓箷瀵嗗害鐨勬崲綆楀拰鐩鎬簰涔嬮棿鐨勭郴鏁幫紝浠ヤ究浣犵殑app鑳藉畬緹庨傚簲涓嶅悓鍒嗚鯨鐜囪懼囥傚叾涓浜や簰璁捐¢渶瑕佷綘鎳傚緱寰堝氫漢鏈烘搷浣滅殑鎶宸х粡楠岋紝鎺屾彙Axure絳変氦浜掑伐鍏風殑浣跨敤錛孶I璁捐¢渶瑕佷綘鎺屾彙Photoshop鍜孖llustrator絳夋搷浣溿
3銆佷嬌鐢ˋDT涔嬬被鐨勫紑鍙戠幆澧冭繘琛宎pp杞浠跺紑鍙戱紝浣犳渶鍩烘湰鐨勪篃寰楁帉鎻java璇璦錛岀啛鎮塧ndroid鐜澧冨拰鏈哄埗銆
4銆佸傛灉涓嶆槸鍗曟満鐗堢殑app錛岄渶瑕佺敤鍒版湇鍔″櫒錛岄偅浣犺繕寰楁帉鎻WebService鐩稿叧鐭ヨ瘑鍜屽紑鍙戣
璦錛屽父鐢ㄧ殑鏈堿SP.Net錛孭HP錛孞SP絳夈
5銆佺啛鎮夊苟鑳藉紑鍙戞暟鎹搴撱
6銆佹煇浜涘姛鑳介渶瑕佸仛綆楁硶錛岃繖榪橀渶瑕佷竴瀹氬緱涓撲笟鐭ヨ瘑錛屽挨鍏舵槸鏁板﹀熀紜銆
7銆佺啛鎮堿PI鎺ュ彛寮鍙戱紝榪欓噷鍖呮嫭浣犺嚜琛屽紑鍙慉PI鐨勮兘鍔涗互鍙婅皟鐢ㄧ涓夋柟API鐨勭粡楠屻
8銆佺啛鎮塗CP/IP錛宻ocket絳夌綉緇滃崗璁鍜岀浉鍏崇煡璇嗐
9銆佺啛緇冩帉鎻App鍙戝竷鐨勬祦紼嬶紝鐪熸満璋冭瘯鎶宸э紝璇佷功錛屾墦鍖咃紝涓婃灦銆 App寮鍙戝叾瀹炰笉涓瀹氶傚悎涓涓浜烘悶錛屽お璐瑰姴錛岄櫎闈炴槸涓涓鍗曟満鐗堢殑灝忓簲鐢錛屾垨鑰呭埄鐢ㄧ幇鎴愮殑app寮鍙戠畝鍗曠殑絎涓夋柟搴旂敤錛屽惁鍒欒繕鏄璁╀竴涓鍥㈤槦鏉ュ畬鎴愬悇鑷鎿呴暱鐨勯嗗煙銆
② 數據結構 java開發中常用的排序演算法有哪些
排序演算法有很多,所以在特定情景中使用哪一種演算法很重要。為了選擇合適的演算法,可以按照建議的順序考慮以下標准:
(1)執行時間
(2)存儲空間
(3)編程工作
對於數據量較小的情形,(1)(2)差別不大,主要考慮(3);而對於數據量大的,(1)為首要。
主要排序法有:
一、冒泡(Bubble)排序——相鄰交換
二、選擇排序——每次最小/大排在相應的位置
三、插入排序——將下一個插入已排好的序列中
四、殼(Shell)排序——縮小增量
五、歸並排序
六、快速排序
七、堆排序
八、拓撲排序
一、冒泡(Bubble)排序
----------------------------------Code 從小到大排序n個數------------------------------------
void BubbleSortArray()
{
for(int i=1;i<n;i++)
{
for(int j=0;i<n-i;j++)
{
if(a[j]>a[j+1])//比較交換相鄰元素
{
int temp;
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
-------------------------------------------------Code------------------------------------------------
效率 O(n²),適用於排序小列表。
二、選擇排序
----------------------------------Code 從小到大排序n個數--------------------------------
void SelectSortArray()
{
int min_index;
for(int i=0;i<n-1;i++)
{
min_index=i;
for(int j=i+1;j<n;j++)//每次掃描選擇最小項
if(arr[j]<arr[min_index]) min_index=j;
if(min_index!=i)//找到最小項交換,即將這一項移到列表中的正確位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
-------------------------------------------------Code-----------------------------------------
效率O(n²),適用於排序小的列表。
三、插入排序
--------------------------------------------Code 從小到大排序n個數-------------------------------------
void InsertSortArray()
{
for(int i=1;i<n;i++)//循環從第二個數組元素開始,因為arr[0]作為最初已排序部分
{
int temp=arr[i];//temp標記為未排序第一個元素
int j=i-1;
while (j>=0 && arr[j]>temp)/*將temp與已排序元素從小到大比較,尋找temp應插入的位置*/
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
------------------------------Code--------------------------------------------------------------
最佳效率O(n);最糟效率O(n²)與冒泡、選擇相同,適用於排序小列表
若列表基本有序,則插入排序比冒泡、選擇更有效率。
四、殼(Shell)排序——縮小增量排序
-------------------------------------Code 從小到大排序n個數-------------------------------------
void ShellSortArray()
{
for(int incr=3;incr<0;incr--)//增量遞減,以增量3,2,1為例
{
for(int L=0;L<(n-1)/incr;L++)//重復分成的每個子列表
{
for(int i=L+incr;i<n;i+=incr)//對每個子列表應用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j>=0&&arr[j]>temp)
{
arr[j+incr]=arr[j];
j-=incr;
}
arr[j+incr]=temp;
}
}
}
}
--------------------------------------Code-------------------------------------------
適用於排序小列表。
效率估計O(nlog2^n)~O(n^1.5),取決於增量值的最初大小。建議使用質數作為增量值,因為如果增量值是2的冪,則在下一個通道中會再次比較相同的元素。
殼(Shell)排序改進了插入排序,減少了比較的次數。是不穩定的排序,因為排序過程中元素可能會前後跳躍。
五、歸並排序
----------------------------------------------Code 從小到大排序---------------------------------------
void MergeSort(int low,int high)
{
if(low>=high) return;//每個子列表中剩下一個元素時停止
else int mid=(low+high)/2;/*將列表劃分成相等的兩個子列表,若有奇數個元素,則在左邊子列表大於右側子列表*/
MergeSort(low,mid);//子列表進一步劃分
MergeSort(mid+1,high);
int [] B=new int [high-low+1];//新建一個數組,用於存放歸並的元素
for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/*兩個子列表進行排序歸並,直到兩個子列表中的一個結束*/
{
if (arr[i]<=arr[j];)
{
B[k]=arr[i];
I++;
}
else
{ B[k]=arr[j]; j++; }
}
for( ;j<=high;j++,k++)//如果第二個子列表中仍然有元素,則追加到新列表
B[k]=arr[j];
for( ;i<=mid;i++,k++)//如果在第一個子列表中仍然有元素,則追加到新列表中
B[k]=arr[i];
for(int z=0;z<high-low+1;z++)//將排序的數組B的 所有元素復制到原始數組arr中
arr[z]=B[z];
}
-----------------------------------------------------Code---------------------------------------------------
效率O(nlogn),歸並的最佳、平均和最糟用例效率之間沒有差異。
適用於排序大列表,基於分治法。
六、快速排序
------------------------------------Code--------------------------------------------
/*快速排序的演算法思想:選定一個樞紐元素,對待排序序列進行分割,分割之後的序列一個部分小於樞紐元素,一個部分大於樞紐元素,再對這兩個分割好的子序列進行上述的過程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low];//採用子序列的第一個元素作為樞紐元素
while (low < high)
{
//從後往前栽後半部分中尋找第一個小於樞紐元素的元素
while (low < high && arr[high] >= pivot)
{
--high;
}
//將這個比樞紐元素小的元素交換到前半部分
swap(arr[low], arr[high]);
//從前往後在前半部分中尋找第一個大於樞紐元素的元素
while (low <high &&arr [low ]<=pivot )
{
++low ;
}
swap (arr [low ],arr [high ]);//將這個樞紐元素大的元素交換到後半部分
}
return low ;//返回樞紐元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low <high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n +1,high );
}
}
----------------------------------------Code-------------------------------------
平均效率O(nlogn),適用於排序大列表。
此演算法的總時間取決於樞紐值的位置;選擇第一個元素作為樞紐,可能導致O(n²)的最糟用例效率。若數基本有序,效率反而最差。選項中間值作為樞紐,效率是O(nlogn)。
基於分治法。
七、堆排序
最大堆:後者任一非終端節點的關鍵字均大於或等於它的左、右孩子的關鍵字,此時位於堆頂的節點的關鍵字是整個序列中最大的。
思想:
(1)令i=l,並令temp= kl ;
(2)計算i的左孩子j=2i+1;
(3)若j<=n-1,則轉(4),否則轉(6);
(4)比較kj和kj+1,若kj+1>kj,則令j=j+1,否則j不變;
(5)比較temp和kj,若kj>temp,則令ki等於kj,並令i=j,j=2i+1,並轉(3),否則轉(6)
(6)令ki等於temp,結束。
-----------------------------------------Code---------------------------
void HeapSort(SeqIAst R)
{ //對R[1..n]進行堆排序,不妨用R[0]做暫存單元 int I; BuildHeap(R); //將R[1-n]建成初始堆for(i=n;i>1;i--) //對當前無序區R[1..i]進行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //將堆頂和堆中最後一個記錄交換 Heapify(R,1,i-1); //將R[1..i-1]重新調整為堆,僅有R[1]可能違反堆性質 } } ---------------------------------------Code--------------------------------------
堆排序的時間,主要由建立初始堆和反復重建堆這兩部分的時間開銷構成,它們均是通過調用Heapify實現的。
堆排序的最壞時間復雜度為O(nlgn)。堆排序的平均性能較接近於最壞性能。 由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的文件。 堆排序是就地排序,輔助空間為O(1), 它是不穩定的排序方法。
堆排序與直接插入排序的區別:
直接選擇排序中,為了從R[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在R[2..n]中選出關鍵字最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留這些比較結果,所以後一趟排序時又重復執行了這些比較操作。
堆排序可通過樹形結構保存部分比較結果,可減少比較次數。
八、拓撲排序
例 :學生選修課排課先後順序
拓撲排序:把有向圖中各頂點按照它們相互之間的優先關系排列成一個線性序列的過程。
方法:
在有向圖中選一個沒有前驅的頂點且輸出
從圖中刪除該頂點和所有以它為尾的弧
重復上述兩步,直至全部頂點均已輸出(拓撲排序成功),或者當圖中不存在無前驅的頂點(圖中有迴路)為止。
---------------------------------------Code--------------------------------------
void TopologicalSort()/*輸出拓撲排序函數。若G無迴路,則輸出G的頂點的一個拓撲序列並返回OK,否則返回ERROR*/
{
int indegree[M];
int i,k,j;
char n;
int count=0;
Stack thestack;
FindInDegree(G,indegree);//對各頂點求入度indegree[0....num]
InitStack(thestack);//初始化棧
for(i=0;i<G.num;i++)
Console.WriteLine("結點"+G.vertices[i].data+"的入度為"+indegree[i]);
for(i=0;i<G.num;i++)
{
if(indegree[i]==0)
Push(thestack.vertices[i]);
}
Console.Write("拓撲排序輸出順序為:");
while(thestack.Peek()!=null)
{
Pop(thestack.Peek());
j=locatevex(G,n);
if (j==-2)
{
Console.WriteLine("發生錯誤,程序結束。");
exit();
}
Console.Write(G.vertices[j].data);
count++;
for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)
{
k=p.adjvex;
if (!(--indegree[k]))
Push(G.vertices[k]);
}
}
if (count<G.num)
Cosole.WriteLine("該圖有環,出現錯誤,無法排序。");
else
Console.WriteLine("排序成功。");
}
----------------------------------------Code--------------------------------------
演算法的時間復雜度O(n+e)。
③ java中遞歸演算法是什麼怎麼算的
一、遞歸演算法基本思路:
Java遞歸演算法是基於Java語言實現的遞歸演算法。遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。遞歸演算法實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法表示問題的解。遞歸往往能給我們帶來非常簡潔非常直觀的代碼形式,從而使我們的編碼大大簡化,然而遞歸的思維確實跟我們的常規思維相逆的,通常都是從上而下的思維問題,而遞歸趨勢從下往上的進行思維。
二、遞歸演算法解決問題的特點:
【1】遞歸就是方法里調用自身。
【2】在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
【3】遞歸演算法代碼顯得很簡潔,但遞歸演算法解題的運行效率較低。所以不提倡用遞歸設計程序。
【4】在遞歸調用的過程中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸演算法設計程序。
【5】在做遞歸演算法的時候,一定把握出口,也就是做遞歸演算法必須要有一個明確的遞歸結束條件。這一點是非常重要的。其實這個出口就是一個條件,當滿足了這個條件的時候我們就不再遞歸了。
三、代碼示例:
publicclassFactorial{
//thisisarecursivefunction
intfact(intn){
if(n==1)return1;
returnfact(n-1)*n;
}}
publicclassTestFactorial{publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Factorialfactorial=newFactorial();
System.out.println("factorial(5)="+factorial.fact(5));
}
}
代碼執行流程圖如下:
此程序中n=5就是程序的出口。
④ 鐢↗AVA璇璦緙栬瘧錛氭暟緇勪腑鍖呭惈n涓鏁存暟錛屼粠鍏朵腑鎵懼嚭k涓鏈灝忕殑鏁幫紝鍐欏嚭浣犺兘鎯沖埌鐨勬渶蹇鐨勬柟娉曪紒錛侊紒
鏈蹇玨*O(n)~O(n)錛屽皢鍓岾涓鏁版斁鍏ヤ竴涓猭鐨勬暟緇勪腑錛屾寜搴忔斁錛屽筀+1鍒癗鐨勬暟錛屼緷嬈″傛灉姣擪鏁扮粍鎬葷殑灝忥紝灝咾涓鏈澶х殑鍙栧嚭錛屾斁鍏ユ渶灝忕殑鏁幫紝涓鐩寸淮鎸並涓錛屾渶鍚庡氨鏄鏈灝忕殑K涓銆
import java.util.Arrays;
/**鍏堢粰鏁板奸噷鐨勫艱繘琛屼粠灝忓埌澶ф帓搴忥紝鍙栦粠0鍒発-1緔㈠紩鐨勬暟緇勫
* @鍒涘緩涓涓鏁扮粍,鍖呭惈11涓鍏冪礌錛屾眰5涓鏈灝忕殑鏁
* @author Administrator
public class ArrayTest {
public static void main(String[] args) {
//鏈灝忓厓緔犵殑涓鏁
int k=5;
//鍒涘緩涓涓鏁扮粍,
int[] arr = {1,3,45,33,67,12,88,11,46,32,89};
//鎿嶄綔鏁扮粍鐨勫伐鍏稟rrays,sort()鏂規硶鑷鍔ㄦ帓搴忥紝鐢卞皬鍒板ぇ
Arrays.sort(arr);
for(int i=0;i<k;i++){
System.out.println(arr[i]);
}
鎵╁睍璧勬枡錛
姝ゅ勬暟緇勬槸紼嬪簭涓澹版槑鐨勫彉閲忔暟緇勩傚畠浠涓嶅悓浜庢帶浠舵暟緇勶紝鎺т歡鏁扮粍鏄鍦ㄨ捐℃椂閫氳繃璁劇疆鎺т歡鐨 Index 灞炴ц勫畾鐨勩傚彉閲忔暟緇勬繪槸榪炵畫鐨勶紱涓庢帶浠舵暟緇勪笉鍚岀殑鏄錛屼笉鑳戒粠涓涓鏁扮粍鐨勪腑閮ㄥ姞杞芥垨鍗歌澆鏁扮粍鍏冪礌銆
涓涓鏁扮粍涓鐨勬墍鏈夊厓緔犲叿鏈夌浉鍚岀殑鏁版嵁綾誨瀷錛堝湪C銆丆++銆丣ava銆乸ascal涓閮借繖鏍楓備絾涔熷苟闈炴墍鏈夋秹鍙婃暟緇勭殑鍦版柟閮借繖鏍鳳紝姣斿傚湪Visual Foxpro涓鐨勬暟緇勫氨騫舵病榪欐牱鐨勮佹眰錛夈傚綋鐒訛紝褰撴暟鎹綾誨瀷涓 Variant 鏃訛紝鍚勪釜鍏冪礌鑳藉熷寘鍚涓嶅悓縐嶇被鐨勬暟鎹錛堝硅薄銆佸瓧絎︿覆銆佹暟鍊肩瓑絳夛級銆傚彲浠ュ0鏄庝換浣曞熀鏈鏁版嵁綾誨瀷鐨勬暟緇勶紝鍖呮嫭鐢ㄦ埛鑷瀹氫箟綾誨瀷鍜屽硅薄鍙橀噺銆
鍙傝冭祫鏂欐潵婧愶細鐧懼害鐧劇-鏁扮粍