java常用算法,java常用算法和數據結構

本文目錄一覽:

數據結構 java開發中常用的排序算法有哪些

排序算法有很多,所以在特定情景中使用哪一種算法很重要。為了選擇合適的算法,可以按照建議的順序考慮以下標準:

(1)執行時間

(2)存儲空間

(3)編程工作

對於數據量較小的情形,(1)(2)差別不大,主要考慮(3);而對於數據量大的,(1)為首要。

主要排序法有:

一、冒泡(Bubble)排序——相鄰交換

二、選擇排序——每次最小/大排在相應的位置

三、插入排序——將下一個插入已排好的序列中

四、殼(Shell)排序——縮小增量

五、歸併排序

六、快速排序

七、堆排序

八、拓撲排序

一、冒泡(Bubble)排序

———————————-Code 從小到大排序n個數————————————

void BubbleSortArray()

{

for(int i=1;in;i++)

{

for(int j=0;in-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;in-1;i++)

{

min_index=i;

for(int j=i+1;jn;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;in;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;incr0;incr–)//增量遞減,以增量3,2,1為例

{

for(int L=0;L(n-1)/incr;L++)//重複分成的每個子列表

{

for(int i=L+incr;in;i+=incr)//對每個子列表應用插入排序

{

int temp=arr[i];

int j=i-incr;

while(j=0arr[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;zhigh-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+1kj,則令j=j+1,否則j不變;

(5)比較temp和kj,若kjtemp,則令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;i1;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;iG.num;i++)

Console.WriteLine(“結點”+G.vertices[i].data+”的入度為”+indegree[i]);

for(i=0;iG.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 (countG.num)

Cosole.WriteLine(“該圖有環,出現錯誤,無法排序。”);

else

Console.WriteLine(“排序成功。”);

}

—————————————-Code————————————–

算法的時間複雜度O(n+e)。

java實現幾種常見排序算法

下面給你介紹四種常用排序算法:

1、冒泡排序

特點:效率低,實現簡單

思想(從小到大排):每一趟將待排序序列中最大元素移到最後,剩下的為新的待排序序列,重複上述步驟直到排完所有元素。這只是冒泡排序的一種,當然也可以從後往前排。

2、選擇排序

特點:效率低,容易實現。

思想:每一趟從待排序序列選擇一個最小的元素放到已排好序序列的末尾,剩下的位待排序序列,重複上述步驟直到完成排序。

3、插入排序

特點:效率低,容易實現。

思想:將數組分為兩部分,將後部分元素逐一與前部分元素比較,如果當前元素array[i]小,就替換。找到合理位置插入array[i]

4、快速排序

特點:高效,時間複雜度為nlogn。

採用分治法的思想:首先設置一個軸值pivot,然後以這個軸值為劃分基準將待排序序列分成比pivot大和比pivot小的兩部分,接下來對劃分完的子序列進行快排直到子序列為一個元素為止。

java中的算法,一共有多少種,哪幾種,怎麼分類。

就好比問,漢語中常用寫作方法有多少種,怎麼分類。

算法按用途分,體現設計目的、有什麼特點

算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等

算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等

作為圖靈完備的語言,理論上」Java語言「可以實現所有算法。

「Java的標準庫’中用了一些常用數據結構和相關算法.

像apache common這樣的java庫中又提供了一些通用的算法

java最常用的幾種加密算法

簡單的Java加密算法有:

第一種. BASE

Base是網絡上最常見的用於傳輸Bit位元組代碼的編碼方式之一,大家可以查看RFC~RFC,上面有MIME的詳細規範。Base編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base來將一個較長的唯一標識符(一般為-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。

第二種. MD

MD即Message-Digest Algorithm (信息-摘要算法),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD的前身有MD、MD和MD。

MD算法具有以下特點:

壓縮性:任意長度的數據,算出的MD值長度都是固定的。

容易計算:從原數據計算出MD值很容易。

抗修改性:對原數據進行任何改動,哪怕只修改個位元組,所得到的MD值都有很大區別。

弱抗碰撞:已知原數據和其MD值,想找到一個具有相同MD值的數據(即偽造數據)是非常困難的。

強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD值,是非常困難的。

MD的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD以外,其中比較有名的還有sha-、RIPEMD以及Haval等。

第三種.SHA

安全哈希算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。對於長度小於^位的消息,SHA會產生一個位的消息摘要。該算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。

SHA-與MD的比較

因為二者均由MD導出,SHA-和MD彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:

對強行攻擊的安全性:最顯著和最重要的區別是SHA-摘要比MD摘要長 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD是^數量級的操作,而對SHA-則是^數量級的操作。這樣,SHA-對強行攻擊有更大的強度。

對密碼分析的安全性:由於MD的設計,易受密碼分析的攻擊,SHA-顯得不易受這樣的攻擊。

速度:在相同的硬件上,SHA-的運行速度比MD慢。

第四種.HMAC

HMAC(Hash Message Authentication Code,散列消息鑒別碼,基於密鑰的Hash算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。

java常見gc算法有哪些

1:標記—清除

Mark-Sweep

過程:標記可回收對象,進行清除

缺點:標記和清除效率低,清除後會產生內存碎片

2:複製算法

過程:將內存劃分為相等的兩塊,將存活的對象複製到另一塊內存,把已經使用的內存清理掉

缺點:使用的內存變為了原來的一半

進化:將一塊內存按8:1的比例分為一塊Eden區(80%)和兩塊Survivor區(10%)

每次使用Eden和一塊Survivor,回收時,將存活的對象一次性複製到另一塊Survivor上,如果另一塊Survivor空間不足,則使用分配擔保機制存入老年代

3:標記—整理

Mark—Compact

過程:所有存活的對象向一端移動,然後清除掉邊界以外的內存

4:分代收集算法

過程:將堆分為新生代和老年代,根據區域特點選用不同的收集算法,如果新生代朝生夕死,則採用複製算法,老年代採用標記清除,或標記整理

面試的話說出來這四種足夠了

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/180002.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:10
下一篇 2024-11-22 05:10

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29

發表回復

登錄後才能評論