① 寮鍙戜竴涓妫嬬墝绫绘父鎴廰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鏄庝换浣曞熀链鏁版嵁绫诲瀷镄勬暟缁勶纴鍖呮嫭鐢ㄦ埛镊瀹氢箟绫诲瀷鍜屽硅薄鍙橀噺銆
鍙傝冭祫鏂欐潵婧愶细锏惧害锏剧-鏁扮粍